AtomicBoolean a = new AtomicBoolean(false);
AtomicBoolean b = new AtomicBoolean(false);
Thread A {
a.compareAndSet(false, true);
b.compareAndSet(false, true);
}
Thread B {
print b.get()
print a.get()
}
从上面的程序片段中,如果两个线程同时运行,则线程B是否可以打印true和false? (这意味着它看到“b”为真,而“a”仍然是假的?
答案 0 :(得分:3)
线程B是否可以打印true和false?
不,不是。如果b
设置为true
,则a
已设置为true
,而AtomicBoolean
包裹volatile
,则两个字段都将为get()
通过volatile
来电更新并显示。任何a
字段的访问都可以确保内存同步以及所有代码预先完成==“之前发生”保证。
当然,这是假设其他线程没有触及b
和B
。
根据竞争条件,false
打印的可能值为:
false
,AtomicBoolean
- 如果false
均未更新true
,b
- 如果a
在打印时未更新但true
true
,b
- 如果a
和{{1}}都已更新答案 1 :(得分:2)
不,a
保证在true
之前设置为b
。读取值后,它们可能true
,false
或a
为true
,b
为{{} 1}}。