百恼Z 2012-07-30 08:31
浏览 235
已采纳

关于++操作线程安全问题的疑惑

[code="java"]
public class TestSynchronizedThread implements Runnable{

private static Integer si = 0;

    private static AtomicInteger flag = new AtomicInteger();  

@Override
public void run() {
    for(int k=0;k<200000;k++){
        synchronized(si){
            si++;
        }
    }
}

public static void main(String[] args) throws InterruptedException{

TestMultiThread t1 = new TestMultiThread();

TestMultiThread t2 = new TestMultiThread();

ExecutorService exec1 = Executors.newCachedThreadPool();

ExecutorService exec2 = Executors.newCachedThreadPool();

exec1.execute(t1);

exec2.execute(t2);

while(true){

if(flag.intValue()==2){

System.out.println("si>>>>>"+si);

break;

}

Thread.sleep(50);

}

}  

}[/code]
这段代码最后结果si打印出来小于400000,为什么加了synchronized后++操作还会产生中间状态,而我在JVM字节码中并未找到相应的证据佐证。
下面是主要JVM字节码:
[code="java"]
0: iconst_0
1: istore_1
2: iload_1
3: ldc #2; //int 200000
5: if_icmpge 55
8: getstatic #3; //Field si:Ljava/lang/Integer;
11: dup
12: astore_2
13: monitorenter
14: getstatic #3; //Field si:Ljava/lang/Integer;
17: astore_3
18: getstatic #3; //Field si:Ljava/lang/Integer;
21: invokevirtual #4; //Method java/lang/Integer.intValue:()I
24: iconst_1
25: iadd
26: invokestatic #5; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
29: dup
30: putstatic #3; //Field si:Ljava/lang/Integer;
33: astore 4
35: aload_3
36: pop
37: aload_2
38: monitorexit
39: goto 49
42: astore 5
44: aload_2
45: monitorexit
46: aload 5
48: athrow
49: iinc 1, 1
52: goto 2
55: return
[/code]
希望各位大侠能帮小弟指点一下迷津。

  • 写回答

1条回答 默认 最新

  • 成正炳 2012-07-30 09:14
    关注

    si++执行后,都会指向一个新的对象。
    synchronized(si),每次进来时si并不是同一个对象。不同对象的上的锁当然不行了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥50 如何用脚本实现输入法的热键设置
  • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能
  • ¥30 深度学习,前后端连接
  • ¥15 孟德尔随机化结果不一致
  • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
  • ¥15 谁有desed数据集呀
  • ¥20 手写数字识别运行c仿真时,程序报错错误代码sim211-100
  • ¥15 关于#hadoop#的问题
  • ¥15 (标签-Python|关键词-socket)