编程中的“原子”是什么意思?

2022-08-31 04:55:08

在《有效的Java》一书中,它指出:

语言规范保证读取或写入变量是原子的,除非变量的类型为 [JLS, 17.4.7]。longdouble

在Java编程或一般编程的上下文中,“原子”是什么意思?


答案 1

下面是一个示例:假设是一个类型的变量,那么下面的操作不是原子操作(在Java中):foolong

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

或者用原子龙代替它:

private AtomicLong foo;

答案 2

“原子操作”是指从所有其他线程的角度来看似乎是即时的操作。当保证适用时,您无需担心部分完成的操作。


推荐