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 fluent的在模拟压强时使用希望得到一些建议
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏
  • ¥15 模糊pid与pid仿真结果几乎一样
  • ¥15 java的GUI的运用
  • ¥15 Web.config连不上数据库
  • ¥15 我想付费需要AKM公司DSP开发资料及相关开发。
  • ¥15 怎么配置广告联盟瀑布流
  • ¥15 Rstudio 保存代码闪退