跨线程变量的每次读取都应该在volatile或Atomic上,或者通过同步进行包装



我可以说,如果一个变量可以被其他线程修改,那么如果没有内存屏障,我永远无法安全地读取它吗?

是的。如果将(w)写入线程T1中的一个变量,并从线程T2读取(r)相同的变量,则需要在(w)和(r)之间建立先发生后发生的关系,以确保(w)的结果对(r)可见。Java内存模型定义了(JLS 17.4.5)先发生后发生关系的情况:

  • 显示器上的解锁发生在该显示器上的每次后续锁定之前
  • 对易失性字段(§8.3.1.4)的写入发生在该字段的每次后续读取之前
  • 在启动的线程中,对start()的调用发生在任何操作之前
  • 线程中的所有操作都发生在任何其他线程从该线程上的join()成功返回之前
  • 任何对象的默认初始化都发生在程序的任何其他操作(默认写入除外)之前

相关内容

最新更新