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()已经同步,它不会使线程安全吗?
还请为这些主题提供一些很好的链接.
问题是这x是一个静态变量,因此由所有线程共享.并且由于所有线程都没有在单个对象上同步(每个线程都this用作锁),因此没有什么能阻止两个线程doThings()并行执行该方法.因此,两个线程可能并行读取x的值,然后并行递增,缺少增量.
制作doThings()静态会使所有线程在单个对象上同步:TestSeven.class
| 归档时间: |
|
| 查看次数: |
1779 次 |
| 最近记录: |