我有来自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. }
哪个论述是对的?
A.编译失败.
B.在运行时抛出异常.
C.同步run()方法会使类成为线程安全的.
D.变量"x"中的数据受到保护,不会出现并发访问问题.
E.将doThings()方法声明为static将使类成为线程安全的.
F.在同步(new Object()){}块中包装doThings()中的语句将使该类成为线程安全的.
答案是选项E.
我的问题:作为方法doThings()已经同步,它不会使线程安全吗?
还请为这些主题提供一些很好的链接.
问题是这x
是一个静态变量,因此由所有线程共享.并且由于所有线程都没有在单个对象上同步(每个线程都this
用作锁),因此没有什么能阻止两个线程doThings()
并行执行该方法.因此,两个线程可能并行读取x的值,然后并行递增,缺少增量.
制作doThings()
静态会使所有线程在单个对象上同步:TestSeven.class