Java 内存模型规范了 JVM 如何提供按需禁用缓存和编译优化的方法

happens-before 规则本质上是来解决可见性的(面一个操作的结果对后续操作是可见的)

1、顺序性规则

就是第一行代码的操作结果对第二行代码一定可见

2、volatile 变量规则
这条规则是指对一个 volatile 变量的写操作, Happens-Before 于后续对这个 volatile 变量的读操作
3、传递性
这条规则是指如果 A Happens-Before B,且 B Happens-Before C,那么 A Happens-Before C
4、管程中锁的规则
指对一个锁的解锁 Happens-Before 于后续对这个锁的加锁。
5、线程 start() 规则

  1. Thread B = new Thread(()->{
  2. // 主线程调用B.start()之前
  3. // 所有对共享变量的修改,此处皆可见
  4. // 此例中,var==77
  5. });
  6. // 此处对共享变量var修改
  7. var = 77;
  8. // 主线程启动子线程
  9. B.start();

6、 线程 join() 规则
如果在线程 A 中,调用线程 B 的 join() 并成功返回,那么线程 B 中的任意操作 Happens-Before 于该 join() 操作的返回

课后习题

课后思考有一个共享变量 abc,在一个线程里设置了 abc 的值 abc=3,你思考一下,有哪些办法可以让其他线程能够看到abc==3?

方法一 读写的时候用synchronized

方法二 用volatile来修饰