并发编程的关键问题:线程通信和线程同步。
线程通信:共享内存和消息传递。
- 共享内存:隐式传递、显式同步;
- 消息传递:显示传递、隐式同步。
重排序:为了提高性能,在不改变单线程程序语义的情况下对指令做重排序。
as-if-serial语义:不管怎么重排序,单线程程序的执行结果不能被改变。
happens-before规则:
- 程序顺序规则: 一个线程中的每个操作,happens-before于该线程中任一后续操作。
- 监视器锁规则:对一个锁的解锁,早于对一个锁的加锁。
- volatile域规则:对一个volatile域的写在于后续对其的读。
- 传递性规则:如果A happens-before B,且B happens-before C,那么A happens-before C。
volatile重排序规则表:
第一\二个操作 | 普通读写 | volatile读 | volatile写 |
---|---|---|---|
普通读写 | N | ||
volatile读 | N | N | N |
volatile写 |
N | N |
内存屏障添加策略:
JAVA线程间的通信方式:
- A写volatile变量,B读volatile变量;
- A写volatile变量,B用CAS更新这个volatile变量;
- A用CAS更新这个volatile变量,B读volatile变量;
- A用CAS更新这个volatile变量,B用CAS更新这个volatile变量;
JAVA并发包结构图: