一、第12章 Java 内存模型
1、Java内存模型
内存间的交互操作:lock、unlock、read、load、use、assign、store、write
volatile 变量:保证变量对所有线程可见;禁止指令重排序优化。
long、double 特殊规则:允许将没有volatile修饰的64位数据操作分成两次32位数据操作。
Java内存模型的特性:
(1)、原子性:除了long和double,对基本类型数据访问都是原子的
(2)、可见性:一个线程修改了共享变量,其他线程能看到。通过volatile、synchronized、final实现。
(3)、有序性:本线程内看所有操作都是有序的, 即线程内表现为串行;线程外看本线程,所有的操作都是无序的,即指令重排序、线程缓存与主内存同步延迟。通过volatile、synchronized 可保证有序性。
2、Java线程
线程的实现: 通过操作系统的内核线程(轻量级进程)实现
线程的调度:采用抢占式调度。
状态转换:New、Runnable、Waiting、Blocked、Teminated
二、第13章 线程安全和锁优化
1、线程安全
(1)、不可变:final
(2)、绝对线程安全:难以实现
(3)、相对线程安全:Vector、Hashtable、同步集合等
(4)、线程兼容:HashMap、ArrayList等
线程安全实现方法:
(1)、互斥同步:synchronized 和 Lock
(2)、非阻塞同步:CAS
(3)、无同步方案:ThreadLocal
2、锁优化
(1)、自旋锁:就是一个空的while 循环。
(2)、锁消除
(3)、锁粗化
(4)、轻量级锁:CAS。
(5)、偏向锁:锁偏向于第一个获得它的线程。