使用原子变量时的内存排序

时间:2013-05-06 22:45:50

标签: java multithreading atomic

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”仍然是假的?

2 个答案:

答案 0 :(得分:3)

  

线程B是否可以打印true和false?

不,不是。如果b设置为true,则a已设置为true,而AtomicBoolean包裹volatile,则两个字段都将为get()通过volatile来电更新并显示。任何a字段的访问都可以确保内存同步以及所有代码预先完成==“之前发生”保证。

当然,这是假设其他线程没有触及bB

根据竞争条件,false打印的可能值为:

  • falseAtomicBoolean - 如果false均未更新
  • trueb - 如果a在打印时未更新但true
  • trueb - 如果a和{{1}}都已更新

答案 1 :(得分:2)

不,a保证在true之前设置为b。读取值后,它们可能truefalseatrueb为{{} 1}}。