0
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”仍为假?

4

2 回答 2

3

线程 B 可以打印真假吗?

不它不是。如果b设置为truethena将已经设置为true并且由于AtomicBoolean包装 a volatile,两个字段都将被更新并在get()调用中可见。对字段的任何访问volatile确保内存同步以及所有代码事先完成==“发生在之前”保证。

当然,这是假设没有其他线程接触ab

在竞争条件下,打印的可能值B是:

  • false, false-- 如果两者AtomicBoolean都没有更新
  • false, true-- 如果在打印时b没有更新,但是a
  • true, true-- 如果两者ba更新了
于 2013-05-06T22:53:08.437 回答
2

不,a保证设置为truebefore b。当读取这些值时,它们可能同时是true、既是false、或者atruebfalse

于 2013-05-06T22:54:06.407 回答