在有效的Java书中,它指出:
语言规范保证读取或写入变量是原子的,除非变量类型为
long或doubleJLS,17.4.7。
在Java编程或一般编程中,“原子”意味着什么?
发布于 2013-02-24 17:07:55
下面是一个示例:假设foo是long类型的变量,那么下面的操作不是原子操作(在Java中):
foo = 65465498L;实际上,变量是使用两个单独的操作编写的:一个操作写前32位,第二个操作写最后32位。这意味着另一个线程可能读取foo的值,并查看中间状态。
使操作原子化包括使用同步机制,以确保从任何其他线程来看,操作都是一个单独的原子操作(即不能分割成几个部分)。这意味着任何其他线程,一旦操作是原子化的,就会在赋值之前或之后看到foo的值。但从来没有中间值。
这样做的一个简单方法是使可变挥发性
private volatile long foo;或同步对变量的每次访问:
public synchronized void setFoo(long value) {
this.foo = value;
}
public synchronized long getFoo() {
return this.foo;
}
// no other use of foo outside of these two methods, unless also synchronized或者用AtomicLong替换它
private AtomicLong foo;发布于 2014-06-25 13:25:19
“原子操作”是指从所有其他线程的角度看来是瞬时的操作。当担保适用时,您不需要担心部分完成的操作。
发布于 2013-02-24 17:00:30
它是“系统的其他部分似乎是瞬间发生的”,在计算过程中属于线性化性的范畴。为了进一步引用这一链接条款:
原子性是与并发进程隔离的保证。此外,原子操作通常有一个成功或失败的定义--它们要么成功地改变系统的状态,要么没有明显的效果。
因此,例如,在数据库系统的上下文中,可以有“原子提交”,这意味着您可以将更新的更改集推送到关系数据库,而这些更改要么全部提交,要么在发生故障时完全不提交,这样数据就不会损坏,锁和/或队列的结果,下一个操作将是不同的写入或读取,而只是在事实发生之后。在变量和线程的上下文中,这在内存中是相同的。
你的报价强调,在所有情况下,这并不一定是预期的行为。
https://stackoverflow.com/questions/15054086
复制相似问题