第3章 Java内存模型

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/NCUscienceZ/article/details/87177550

3.1 Java内存模型的基础
3.1.1 并发编程模型的两个关键问题
1、线程之间的通信机制是哪两种?
2、线程同步显式进行与隐式进行的区别?
3、java并发采用的是哪种模型?Java线程之间的通信是显式还是隐式的?

3.1.2 Java内存模型的抽象结构
1、java内存模型JMM的结构是什么?
2、线程之间的通信过程具体是什么?

3.1.3 从源代码到指令序列的重排序
3.1.4 并发编程模型的分类
3.1.5 happens-before简介

3.2 重排序
3.2.1 数据依赖性
1、什么情况下两个操作存在数据依赖性?
2、数据以来分为下列哪种类型?

3.2.2 as-if-serial语意
3.2.3 程序顺序规则
3.2.4 重排序对多线程的影响

3.3 顺序一致性
3.3.1 数据竞争与顺序一致性
1、Java内存模型规范对数据竞争的定义是什么?

3.3.2 顺序一致性内存模型
3.3.3 同步程序的顺序一致性效果
3.3.4 未同步程序的执行特性
(以上部分再看再看,太底层了,第一遍没太看懂)

3.4 volatile的内存语义
3.4.1 volatile的特性
1、volatile的两特性?

3.4.2 volatile写-读建立的happens-before关系
1、从内存语义角度来说,volatile与锁?

3.4.3 volatile写-读的内存语义
1、当写一个volatile变量时,JMM底层的操作是什么?
2、当读一个volatile变量时,JMM底层的操作是什么?
3、对volatile写和volatile读的内存语义的三点总结:

3.4.4 volatile内存语义的实现
1、volatile重排序规则是什么?(3条)
2、为了实现volatile的内存语义,编译器在生成字节码时JMM会怎么处理?
3、JMM处理volatile时的屏障插入策略是什么?(4条)

3.4.5 JSR-133为什么要增强volatile的内存语义
(以上对volatile底层的讲解非常好)

3.5 锁的内存语义
3.5.1 锁的释放-获取建立的happens-before关系
3.5.2 锁的释放-获取的内存语义
1、锁的释放和获取时,内存对加锁变量的具体操作是什么?
2、从内存语义的角度锁与volatile的相同处?
3、从消息传送角度如何理解线程A释放锁随后线程B释放锁?

3.5.3 锁内存语义的实现(细节再看再复习)
1、要了解CAS如何同时具有volatile读和volatile写的内存语义?
2、从表面上来看,锁释放-获取的内存语义实是由哪两种方式实现?
(volatile, cas)

3.5.4 concurrent包的实现
1、由于Java的CAS同时具有volatile读和volatile写的内存语义,因此Java线程之间的通信现在有了哪4种方式?
2、concurrent包实现三层层级示意图是什么?

3.6 final域的内存语义
1、对于final域,编译器和处理器要遵守的两个重排序规则是什么?

3.6.2 写final域的重排序规则
1、写final域的重排序规则禁止把final域的写重排序到构造函数之外,这个规则如何实现?
2、final域的重排序规则保障了什么?普通域不具备这种保障会有什么问题(书中例子)?

3.6.3 读final域的重排序规则
1、读final域的重排序规则是什么?
2、初次读对象引用与初次读该对象包含的final域,这两个操作之间存在间接依赖关系。编译器会重排吗?处理器呢?

3.6.4 final域为引用类型
1、当final域为一个引用类型时,写final域的重排序规则对编译器和处理器增加了什么约束?
2、这个约束可以起到什么作用?(例子)

3.6.5 为什么final引用不能从构造函数内“溢出”
1、在构造函数返回前,被构造对象的引用不被其他线程所见会产生什么问题?

3.6.6 final语义在处理器中的实现
3.6.7 JSR-133为什么要增强final的语义
1、在增强final语义之前,多线程下final变量会有什么问题?

3.7 happens-before
3.7.1 JMM的设计
1、JMM把happens-before要求禁止的重排序分为了下面哪两类?
2、JMM对这两种不同性质的重排序,采取了哪两种不同的策略?

3.7.2 happens-before的定义
3.7.3 happens-before规则

3.8 双重检查锁定与延迟初始化
3.8.1 双重检查锁定的由来
1、什么是双重检查锁定?

3.8.2 问题的根源
1、双重检查锁定到底有什么问题?

3.8.3 基于volatile的解决方案

3.8.4 基于类初始化的解决方案

3.9 Java内存模型综述

猜你喜欢

转载自blog.csdn.net/NCUscienceZ/article/details/87177550