调用顺序
    volatile -> cpp -> asm -> lock addl
    关键:asm中的 ** **lock addl
    特性:

    1. 线程间的可见性 当线程的数据修改之后会通知其他线程缓存失效, 其他线程需要重新读取主内存的数据,读取或者通知的单位是基于缓存行的,以一个缓存行为一个单位,进行通知,重新读取,一般是64byte, 这就会导致伪共享,比如 ; ``` int a ; int b ; //如果 a 和 b 是位于同一个缓存行 线程1 频繁修改a数据, 线程2频繁 修改a数据 ,由于是位于一个缓存行,所以会相互通知, 不断频繁去主内存读取,到时耗性能
      知识点: 缓存一致性协议

    如果改为:

    int a ; int p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15 ; int b ;

    ```

    1. 防止指令重排序 (内存屏障barriers, 每个虚拟机的实现都实现了虚拟机规范: LS LL SS SL )

    最初的应用框架: Disruptor
    参考: http://ifeve.com/disruptor-cacheline-padding/
    https://www.jianshu.com/p/c3c108c3dcfd



    **