方法调用和原子性

Sta*_*lin 2 java concurrency atomic method-call

我有一个单一原子操作的方法,就像这个

int value;

public void setValue(int value) {
    this.value = value;
}
Run Code Online (Sandbox Code Playgroud)

然后我以明显的方式称呼它,比如

foo.setValue(10);
Run Code Online (Sandbox Code Playgroud)

问题是:它是原子操作吗?如果不是,将执行哪些原子操作?我如何在我的电脑上测试这个(如果可以的话)?

aio*_*obe 11

是的

this.value = value;
Run Code Online (Sandbox Code Playgroud)

操作是原子的.请参阅Java语言规范:线程和锁.

请注意,虽然允许线程缓存它们自己的非易失性变量值,但不能保证连续的get -operation会产生最后一个设置.

要摆脱这些类型的数据竞争,您需要以某种方式同步对变量的访问.这可以通过

  • 使方法同步,
  • 让变量变得不稳定,或
  • AtomicIntegerjava.util.concurrent包中使用.(首选方式imo)

还应当指出的是,该操作将不会,如果你从改变是原子intlongdouble.以下是JLS的相关部分:

17.4双原子和非原子的非原子化处理

如果double或long变量未声明为volatile,则为了加载,存储,读取和写入操作的目的,它们被视为两个变量,每个变量32位:规则要求其中一个动作,两个执行动作,每个32位一半.


一些有用的链接: