В соответствии с некоторыми документами, которые я прочитал в Интернете, переменные класса Atomic, такие как AtomicInteger
, AtomicLong
, ... разрешают только один поток для доступа к ним в одно и то же время. Но когда я попробовал тестирование с AtomicBoolean
, что-то пошло не так. НапримерДействительно ли AtomicBoolean гарантирует «безопасную нить»?
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();
}
}
Выходной
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
В 2 линии (*), хотя Т3 установить AtomicBoolean
истинно, после этого, Т1 прочитать значение было ложным. Итак, T1 и T3 одновременно получают доступ к AtomicBoolean
? Я не могу понять, как работает AtomicBoolean
.
Может кто-нибудь мне помочь?
@ElliottFrisch Не могли бы вы объяснить более четко? :( –
Нет никакой волшебной пули, которая обеспечит безопасность потока. Даже если каждая операция, выполняемая вашим кодом, индивидуально поточно-безопасна, это не обязательно сделает все это потокобезопасным. –