《Java 并发编程实战》学习笔记 Day3

76 阅读1分钟

1 什么是 Java 内存模型

Java 内存模型是个很复杂的规范,可以从不同的视角来解读,站在我们这些程序员的视角,本质上可以理解为,Java 内存模型规范了 JVM 如何提供按需禁用缓存和编译优化的方法。具体来说,这些方法包括 volatile、synchronized 和 final 三个关键字,以及六项 Happens-Before 规则。

2 Happens-Before 规则

前面一个操作的结果对后续操作是可见的

2.1 程序的顺序性规则

在一个线程中,按照程序顺序,前面的操作 Happens-Before 于后续的任意操作。

2.2 volatile 变量规则

对一个 volatile 变量的写操作, Happens-Before 于后续对这个 volatile 变量的读操作。

2.3 传递性

如果 A Happens-Before B,且 B Happens-Before C,那么 A Happens-Before C。

2.4 管程中锁的规则

对一个锁的解锁 Happens-Before 于后续对这个锁的加锁。

2.5 线程 start() 规则

主线程 A 启动子线程 B 后,子线程 B 能够看到主线程在启动子线程 B 前的操作。

2.6 线程 join() 规则

主线程 A 等待子线程 B 完成(主线程 A 通过调用子线程 B 的 join() 方法实现),当子线程 B 完成后(主线程 A 中 join() 方法返回),主线程能够看到子线程的操作。当然所谓的“看到”,指的是对共享变量的操作。

参考