OCJP转储多线程ThreadSeven扩展Thread

Sri*_*nth 5 java multithreading thread-safety

我有来自OCJP转储的简单问题.

问题编号:220鉴于:

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. }
Run Code Online (Sandbox Code Playgroud)

哪个论述是对的?

A.编译失败.

B.在运行时抛出异常.

C.同步run()方法会使类成为线程安全的.

D.变量"x"中的数据受到保护,不会出现并发访问问题.

E.将doThings()方法声明为static将使类成为线程安全的.

F.在同步(new Object()){}块中包装doThings()中的语句将使该类成为线程安全的.

答案是选项E.

我的问题:作为方法doThings()已经同步,它不会使线程安全吗?

还请为这些主题提供一些很好的链接.

JB *_*zet 7

问题是这x是一个静态变量,因此由所有线程共享.并且由于所有线程都没有在单个对象上同步(每个线程都this用作锁),因此没有什么能阻止两个线程doThings()并行执行该方法.因此,两个线程可能并行读取x的值,然后并行递增,缺少增量.

制作doThings()静态会使所有线程在单个对象上同步:TestSeven.class