【发布时间】:2016-01-14 07:00:31
【问题描述】:
我真的想不出这个问题的好标题,但问题是Foo 构造函数中对Atomic.set 的以下调用是否是原子的,或者线程是否可以在调用AtomicInteger.set 之前切换?
public class Foo {
private final Atomic atomic = new Atomic();
public Foo() {
atomic.set(10);
}
private static class Atomic {
private final AtomicInteger atomicInt = new AtomicInteger();
public void set(int i) {
atomicInt.set(i);
}
}
}
【问题讨论】:
-
如果线程在调用
AtomicInteger.set之前切换会出现什么问题? -
@LouisWasserman 我实际上并没有那么远;只是好奇...
-
原子性不是为了防止上下文切换。这是为了确保任何线程始终看到一致、正确的状态,尽管上下文切换。
-
我想你可能误解了原子的意思。这并不意味着在通话之前或之后不会发生任何事情——而是在通话的“中间”不会发生任何事情。例如,如果您在一个线程中执行
i.set(0)而在另一个线程中执行i.set(-1),您将不会看到一些位为 0 而其他位为 1——也就是说,它永远不会看起来像一个线程写了 0在另一个写 1 的线程中间。 -
@JBNizet + yshavit,我明白原子的意思,我只是好奇这里发生了什么,即如果调用了一个方法,并且该方法是一个原子操作,整个方法会调用吗是原子的?
标签: java multithreading concurrency atomic