日期:2014-05-20  浏览次数:20627 次

对AtomicInteger的一点疑惑,请大师帮忙解答一下
AtomicInteger的“boolean compareAndSet(int expect, int update)”方法,API上解释的比较清楚了,是说“如果当前值 == 预期值,则以原子方式将该设置为给定的更新值”,并且,它内部是调用的一个native方法。
我的疑惑如下:
1、为而要用native实现这个功能,直接“if(value==expect) value=update;”不可以吗?
2、是否是考虑到“if(value==expect) value=update;”这个写法不是多线程安全的?我试过,貌似是多线程安全的;
3、请问有没有什么示例代码能证明用“if(value==expect) value=update;”不可取代native方式,或是说用什么代码能体现出JDK里compareAndSet和自己写的“if(value==expect) value=update;”的区别?

------解决方案--------------------
引用:
是否是考虑到“if(value==expect) value=update;”这个写法不是多线程安全的?我试过,貌似是多线程安全的;


不错,这个写法不是多线程安全的。

你试不出它不安全,不表示它是安全的。

1 - 线程 a 执行这段代码,先测试 value == expect,得结果 true
2 - 此时线程 b 更改了 value 的值
3 - 线程 a 执行 value = update,但其实此时 value == expect 已经不成立了