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会产生最后一个设置值.
要摆脱这些类型的数据竞争,您需要以某种方式同步对变量的访问.这可以通过
AtomicInteger从java.util.concurrent包中使用.(首选方式imo)还应当指出的是,该操作将不会,如果你从改变是原子int到long或double.以下是JLS的相关部分:
17.4双原子和非原子的非原子化处理
如果double或long变量未声明为volatile,则为了加载,存储,读取和写入操作的目的,它们被视为两个变量,每个变量32位:规则要求其中一个动作,两个执行动作,每个32位一半.
一些有用的链接: