什么是“原子”,在节目是什么意思?(What does “atomic” mean in progr

2019-07-20 10:55发布

在有效的Java书,它指出:

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

什么是“原子”在Java编程,或在总体规划的背景是什么意思?

Answer 1:

下面是一个例子,因为一个例子往往比长篇大论地解释清楚。 假设foo是类型的变量long 。 以下操作不是一个原子操作:

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;


Answer 2:

“原子操作”指的是似乎是从所有其他线程的透视瞬时的操作。 您不必再担心部分完整的操作时,保证适用。



Answer 3:

这件事情,“似乎在瞬间发生了系统的其余部分”,而下分类属于线性化的计算过程。 为了进一步引述该链接的文章:

原子是由并发进程隔离的保证。 此外,原子操作通常有一个成功,或失效的定义 - 他们要么成功地改变系统的状态,或者没有明显的影响。

因此,例如,在数据库系统中的情况下,可以有“原子提交”,这意味着你可以把更新的变更到关系数据库,这些更改将要么全部提交,或者他们没有在所有失败的情况下,这样的数据不发生腐败,以及相应的锁和/或队列,接下来的操作将是一个不同的写或读,但只有在事后 。 在变量的上下文和线程,这是几乎相同的,施加到存储器。

你的报价突出了这种需要不能指望在所有情况下的行为。



Answer 4:

刚刚发现一个帖子原子与非原子操作是对我很有帮助。

“作用于共享存储器的操作是原子的,如果它在单一步骤中相对于其他线程完成。

当在共享存储器执行一个原子商店,没有其他的线程能够观察修改完成一半。

当在共享变量执行的原子负载时,它读取整个价值,因为它出现在某一时刻“。



Answer 5:

如果你有多个线程执行下面的代码的方法M1和M2:

class SomeClass {
    private int i = 0;

    public void m1() { i = 5; }
    public int m2() { return i; }
}

你必须保证,任何线程调用m2要么读0或5。

在另一方面,与此代码(其中i是一个长期的):

class SomeClass {
    private long i = 0;

    public void m1() { i = 1234567890L; }
    public long m2() { return i; }
}

一个线程调用m2可以读取0,1234567890L,或一些其它的随机值,因为该语句i = 1234567890L不保证是原子为long (一个JVM可以写前32位和后32位在两个操作和一个螺纹可以观察i之间)。



文章来源: What does “atomic” mean in programming?
标签: java atomic