读《Java并发编程的艺术》(二)

作者: 方腾飞 魏鹏 程晓明

第三章、Java内存模型

1、Java内存模型的抽象结构
(1)所有实例域、静态域和数组元素都存储在堆内存中,堆内存在线程之间共享
(2)局部变量和异常处理器参数不会在线程之间共享,它们不会有内存可见性问题,也不受内存模型的影响
(3)Java内存模型JMM巨鼎一个线程对共享变量的写入何时对另一个线程可见
(4)JMM通过控制主内存与每个线程的本地内存之间的交互,来为Java程序提供内存可见性保证

2、从源代码到指令序列的重排序类型
(1)编译器优化的重排序
(2)指令级并行的重排序:指令级并行技术将多条指令重叠执行,如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序
(3)内存系统的重排序:由于处理器使用缓存和读/写缓冲区,这使得加载和存储操作看上去可能是乱序执行

3、内存屏障
(1)LoadLoadBarriers : Load1 ; LoadLoad ; Load2
(2)StoreStoreBarriers: Store1 ; StoreStore ; Store2
(3)LoadStoreBarriers : Load1 ; LoadStore ; Store2
(4)StoreLoadBarriers: Store1 ; StoreLoad ; Load2

4、happens - before
在JMM中,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须要存在happens-before关系(这两个操作可以是在一个线程之内,也可以是在不同线程之间)

5、happens-before规则
(1)程序顺序规则:一个线程中的每个操作,happens-before于该线程中的任意后续操作
(2)监视器锁规则:对一个锁的解锁,happens-before于随后对这个锁的加锁
(3)volatile变量规则:对一个volatile域的写,happens-before于任意后续对这个volatile域的读
(4)传递性:A先B,B先C,则A先C

6、数据的依赖性
数据依赖性仅针对单个处理器中执行的指令序列和单个线程中执行的操作,不同处理器之间和不同线程之间的数据依赖性不被编译器和处理器考虑

7、as - if - serial
(1)不管怎么重排序(编译器和处理器为了提高并行度),(单线程)程序的执行结果不能被改变
(2)as - if - serial 语义使单线程无需担心重排序会干扰他们,也无需担心内存可见性问题

8、顺序一致性
(1)顺序一致性内存模型是一个理论参考模型
(2)两大特性:一个线程中的所有操作必须按照程序的顺序来执行;(不管程序是否同步)所有线程都只能看到一个单一的操作执行顺序,在顺序一致性内存模型中,每个操作都必须原子执行且立刻对所有线程可见

9、JMM不保证对64位的long型和double型变量的写操作具有原子性

10、volatile内存语义
锁的happens-before规则保证释放锁和获取锁的两个线程之间的内存可见性,这意味着对一个volatile变量的读,总能看到任意线程对这个volatile变量最后的写入

11、保守策略的JMM内存屏障插入策略
(1)在每个volatile写操作的前面插入一个StoreStore屏障
(2)在每个volatile写操作的前面插入一个StoreLoad屏障
(3)在每个volatile读操作的前面插入一个LoadLoad屏障
(4)在每个volatile读操作的前面插入一个LoadStore屏障

12、volatile仅仅保证对单个volatile变量的读/写具有原子性,而锁的互斥执行的特性可以确保对整个临界区代码的执行具有原子性

13、当线程释放锁时,JMM会把该线程对应的本地内存中的共享变量刷新到主内存中

14、当线程获取锁时,JMM会把该线程对应的本地内存置为无效

15、ReentrantLock调用lock()获取锁,unlock()释放锁

16、ReentrantLock的实现依赖于Java同步器框架AbstractQueuedSynchronizer(AQS),AQS使用一个整型的volatile变量(state)来维护同步状态

17、公平锁和非公平锁的内存语义
(1)公平锁和非公平锁释放锁时,最后都要写一个volatile变量state
(2)公平锁获取时,首先会去读volatile变量
(3)非公平锁获取时,首先会用CAS更新volatile变量

18、as-if-serial语义保证单线程内程序的执行结果不被改变,happens-before关系保证正确同步的多线程程序的执行结果不被改变

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值