Multithreading ThreadSeven extends Thread

Viewed 2868

I have simple question from OCJP

Given:

1. public class TestSeven extends Thread {
2.     private static int x;
3.     public synchronized void doThings() {
4.         int current = x;
5.         current++;
6.         x = current;
7.     }
8.     public void run() {
9.         doThings();
10.    }
11. }

Which statement is true?

A. Compilation fails.

B. An exception is thrown at runtime.

C. Synchronizing the run() method would make the class thread-safe.

D. The data in variable "x" are protected from concurrent access problems.

E. Declaring the doThings() method as static would make the class thread-safe.

F. Wrapping the statements within doThings() in a synchronized(new Object()) { } block would make the class thread-safe.

Answer is option E.

My Question: as method doThings() is already synchornozed, doesn't it make thread safe?

Please also give some good links for these topics.

5 Answers

Though the answers are more on synchronized method of doThings(), which is correct, but in particular the static member x, “may be” cached with the values in respective Thread objects. The x will not be truely shared among all threads until it is volatile.

Related