我可以说,如果一个变量可以被其他线程修改,那么如果没有内存屏障,我永远无法安全地读取它吗?
是的。如果将(w)写入线程T1中的一个变量,并从线程T2读取(r)相同的变量,则需要在(w)和(r)之间建立先发生后发生的关系,以确保(w)的结果对(r)可见。Java内存模型定义了(JLS 17.4.5)先发生后发生关系的情况:
- 显示器上的解锁发生在该显示器上的每次后续锁定之前
- 对易失性字段(§8.3.1.4)的写入发生在该字段的每次后续读取之前
- 在启动的线程中,对start()的调用发生在任何操作之前
- 线程中的所有操作都发生在任何其他线程从该线程上的join()成功返回之前
- 任何对象的默认初始化都发生在程序的任何其他操作(默认写入除外)之前