在《有效Java》一书中,它指出:
语言规范保证读或写
变量为原子变量,除非变量类型为long或double[JLS,
17.4.7]
在Java编程或一般编程的上下文中,“原子”是什么意思
下面是一个示例:假设foo是long类型的变量,那么下面的操作不是原子操作(在Java中):
foo=65465498L;
实际上,变量是使用两个独立的操作写入的:一个写入前32位,另一个写入最后32位。这意味着另一个线程可能会读取foo的值,并查看中间状态
使操作原子化包括使用同步机制,以确保从任何其他线程将操作视为单个原子(即,不可拆分为部分)操作。这意味着任何其他线程,一旦操作成为原子操作,就会在赋值之前或赋值之后看到foo的值。但绝不是中间值
一种简单的方法是将https://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html“rel=”noreferrer“>可变易失性:
私有易失性长foo;
或同步对变量的每次访问:
公共同步的void setFoo(长值){
this.foo=值;
}
公共同步长getFoo(){
返回此.foo;
}
//除了这两个方法之外,没有其他的foo用法,除非也是同步的
或者将其替换为AtomicLong:
私有原子长foo;