据我所知,原子操作是不可分割的,即一个线程可以在线程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.我是对的吗?我想念一下吗?
提前感谢你
答案 0 :(得分:3)
这是不正确的。根据定义,原子学在一次操作中完成。在幕后,JVM正在使用Unsafe.compareAndSwap
方法,该方法模拟单个处理器指令,该指令将增加一个值而不用担心先发制人。因此,线程1将值增加到6,线程2将值增加到7。
答案 1 :(得分:2)
完全针对该用例进行了调整。如果两个线程读取一个将来到另一个。一个将获得6,另一个将不会看到值5。
记住要保持递增的值。
public void incrementMe() {
int xx = atomicInt.incrementAndGet();
}