私はインターネットで読み取ったいくつかの文書によれば、クラス原子の変数AtomicInteger
、AtomicLong
のように、... 1つのスレッドだけが同時にそれらにアクセスすることができます。しかし、AtomicBoolean
でテストしようとしたときに、何かが間違っていました。例えばAtomicBooleanは "safe-thread"を保証しますか?
public class TestAtomicBoolean {
public static void main(String[] args) {
final AtomicBoolean atomicBoolean = new AtomicBoolean(false);
new Thread("T1") {
@Override
public void run() {
while (true) {
System.out.println(Thread.currentThread().getName() + " is waiting for T3 set Atomic to true. Current is " + atomicBoolean.get());
if (atomicBoolean.compareAndSet(true, false)) {
System.out.println("Done. Atomic now is " + atomicBoolean.get());
break;
}
}
}
}.start();
new Thread("T2") {
@Override
public void run() {
while(true) {
System.out.println(Thread.currentThread().getName() + " " + atomicBoolean.get());
}
}
}.start();
new Thread("T3") {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " " + atomicBoolean.get());
System.out.println(Thread.currentThread().getName() + " is setting atomic to true");
atomicBoolean.set(true);
System.out.println(Thread.currentThread().getName() + " " + atomicBoolean.get());
}
}.start();
}
}
出力2ライン(*)で
T1 is waiting for T3 set Atomic to true. Current is false
T1 is waiting for T3 set Atomic to true. Current is false
T3 is setting atomic to true
T2 false
T3 true (*)
T1 is waiting for T3 set Atomic to true. Current is false (*)
T2 true
Done. Atomic now is false
T2 false
、T3がtrueにAtomicBoolean
を設定しているが、その後、T1の値がfalseであった読み出します。したがって、T1とT3は同時にAtomicBoolean
にアクセスしますか? AtomicBoolean
の仕組みを理解できません。
誰かが私を助けることができますか?
@ElliottFrischもっと明確に説明できますか? : –
コードで実行されるすべての操作が個別にスレッドセーフであっても、必ずしもスレッドセーフではありません。 –