深入探析Java线程锁机制

欢迎进入Java社区论坛,与200万技术人员互动交流 >>进入

  有了这四段代码我想问题大概可以说明白了,这里说一下输出吧。

  代码一:<4000000

  代码二:=4000000

  代码三:<4000000

  代码四:<4000000(PS:这个结果非常接近4000000)

  这里说明一下我测试中碰到的问题,代码四一直没有跑出我想要的结果,主要是开始我设的循环次数太少,其实这里如果要这个现象更加明显一些可以在中间多new 几个Object 如下面的代码五,这样现象就比较明显了.

  代码五:

  [java]

  public void run() {

  for(int k=0;k<2000000;k++){

  synchronized(o){

  si++;

  Object temp = o;

  for(int m=0;m<10;m++){

  o = new Object();

  }

  o = temp;

  }

  }

  flag.incrementAndGet();

  }

  为什么会出现上面的现象:

  代码一:当si做++操作后(可以直接看字节码,这里不贴了)在putstatic之前有几步操作,就是我们常说的非原子操作,而这时候si已经不是原来的对象了,这样锁对另外一个线程来说就失效了,我想代码三和代码四就是最好的佐证,代码四更有说服力。当时因为没有出现预想的情况困惑了挺久。

  其实这里用字节码来解释还不是很严谨,最好的当然直接是汇编代码

  如有什么问题还希望各位读者指正。

[1][2]

并且如此真实的活着——这,就是旅行的意义。

深入探析Java线程锁机制

相关文章:

你感兴趣的文章:

标签云: