jwx0925 2012-04-04 18:42
浏览 358
已采纳

java并发,操作i++,一个诡异的问题!

源代码

[code="java"]
public class Test {

public static void main(String[] args) {

    final TestRun run = new TestRun();

    Thread thread = new Thread(run);
    Thread thread2 = new Thread(run);
    thread.start();
    thread2.start();

}

}

class TestRun implements Runnable {

public Integer i    = 0;
public Object  lock = new Object();

@Override
public void run() {
    synchronized (i) {
        i++;
        System.out.println("step1:" + i);
        i++;
        System.out.println("step2:" + i);
    }
}

}

[/code]
运行的结果。按理说,锁住了i对象,同步快中的内容顺序执行,结果为:
step1:1
step2:2
step1:3
step2:4

但结果却是:
step1:1
step1:2
step2:3
step2:4
或者
step1:1
step2:3
step1:2
step2:4

貌似没有锁住。
当改为synchronized (lock){
……
}
结果就正常了!

为什么????锁住对象了,不能对对象进行操作吗?

  • 写回答

3条回答 默认 最新

  • -量- 2012-04-05 05:22
    关注

    原因是Java的自动封箱和解箱操作在作怪。
    这里的i++实际上是i = new Integer(i+1),所以执行完i++后,i已经不是原来的对象了,同步块自然就无效了。
    其它基本类型的封装类,如Short、Long等等也不能作为同步对象

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 关于#嵌入式硬件#的问题:树莓派第一天重装配置python和opencv后第二天打开就成这样,瞎捣鼓搞出来文件夹还是没把原来的界面调回来
  • ¥20 Arduino 循迹小车程序电路出错故障求解
  • ¥20 Arduino 循迹小车程序电路出错故障求解
  • ¥100 AT89C52单片机C语言调试之后再回答
  • ¥15 AT89C52单片机C语言串口助手发送数据包返回值
  • ¥15 C++数组中找第二小的数字程序纠错
  • ¥15 wannier复现图像时berry曲率极值点与高对称点严重偏移
  • ¥15 利用决策森林为什么会出现这样·的问题(关键词-情感分析)
  • ¥15 DispatcherServlet.noHandlerFound No mapping found for HTTP request with URI[/untitled30_war_e
  • ¥15 使用deepspeed训练,发现想要训练的参数没有梯度