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条)

报告相同问题?

悬赏问题

  • ¥20 蓝牙耳机怎么查看日志
  • ¥15 Fluent齿轮搅油
  • ¥15 八爪鱼爬数据为什么自己停了
  • ¥15 交替优化波束形成和ris反射角使保密速率最大化
  • ¥15 树莓派与pix飞控通信
  • ¥15 自动转发微信群信息到另外一个微信群
  • ¥15 outlook无法配置成功
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏