并发编程的关键问题:线程通信和线程同步。
    线程通信:共享内存和消息传递。

    1. 共享内存:隐式传递、显式同步;
    2. 消息传递:显示传递、隐式同步。

    重排序:为了提高性能,在不改变单线程程序语义的情况下对指令做重排序。
    as-if-serial语义:不管怎么重排序,单线程程序的执行结果不能被改变。
    happens-before规则

    1. 程序顺序规则: 一个线程中的每个操作,happens-before于该线程中任一后续操作。
    2. 监视器锁规则:对一个锁的解锁,早于对一个锁的加锁。
    3. volatile域规则:对一个volatile域的写在于后续对其的读。
    4. 传递性规则:如果A happens-before B,且B happens-before C,那么A happens-before C。

    volatile重排序规则表

    第一\二个操作 普通读写 volatile读 volatile写
    普通读写 N
    volatile读 N N N


    volatile写
    N N

    内存屏障添加策略
    JAVA线程间的通信方式:

    1. A写volatile变量,B读volatile变量;
    2. A写volatile变量,B用CAS更新这个volatile变量;
    3. A用CAS更新这个volatile变量,B读volatile变量;
    4. A用CAS更新这个volatile变量,B用CAS更新这个volatile变量;

    JAVA并发包结构图: