1

我可以说如果一个变量可以被其他线程修改,我就不能在没有内存屏障的情况下安全地读取它吗?

4

1 回答 1

1

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

  • 监视器上的解锁发生在该监视器上的每个后续锁定之前。
  • 对 volatile 字段(第 8.3.1.4 节)的写入发生在对该字段的每次后续读取之前。
  • 线程上的 start() 调用发生在已启动线程中的任何操作之前。
  • 线程中的所有操作都发生在任何其他线程从该线程上的 join() 成功返回之前。
  • 任何对象的默认初始化发生在程序的任何其他操作(默认写入除外)之前。
于 2012-09-15T17:09:51.140 回答