原子操作是否需要在Java中进行同步

时间:2014-02-04 05:45:02

标签: java multithreading thread-safety

据我所知,原子操作是不可分割的,即一个线程可以在线程2更改之前或线程2进行更改之后查看系统状态,但不能介于两者之间。

比方说,我在2个线程的共享对象上有一个方法:

public void incrementMe() { 
 //incrementing a shared int for this example
 atomicInt.incrementAndGet();
}

例如我们的原子int的初始值是5.现在,线程1和线程2都同时调用incrementMe。会发生什么?据我所知,线程1将看到值5并将其增加到6,同时线程2将看到值5,因为增量是原子的,因此线程2可以看到更改后的值但是之间没有,所以它将它增加到6,最后我将得到值6而不是7.我是对的吗?我想念一下吗?

提前感谢你

2 个答案:

答案 0 :(得分:3)

这是不正确的。根据定义,原子学在一次操作中完成。在幕后,JVM正在使用Unsafe.compareAndSwap方法,该方法模拟单个处理器指令,该指令将增加一个值而不用担心先发制人。因此,线程1将值增加到6,线程2将值增加到7。

答案 1 :(得分:2)

完全针对该用例进行了调整。如果两个线程读取一个将来到另一个。一个将获得6,另一个将不会看到值5。

记住要保持递增的值。

 public void incrementMe() {
   int xx = atomicInt.incrementAndGet();
 }