线程基础
Thread
建立线程方式
extends Thread
implements Runnable
为什么Thread中有些方法是deprecated?
suspend
resume
stop
为什么不建议依赖Thread的优先级?
调度方式
抢占式
时间片式
线程模型
绿色线程模型
本地线程模型
interrupt和interrupted区别是什么?
interrupt
interrupted
synchronized、volatile
基本概念
引用、状态的可见性
操作的互斥性
synchronized
可见性
互斥性
执行
(1)获得同步锁(互斥)
(2)清空线程工作内存
(3)从主存拷贝变量副本到线程工作内存(对本线程可见)
(4)在线程中对变量进行处理
(5)将变量从线程工作内存写回到主存(对其他线程可见)
(6)释放锁(解除互斥)
volatile
可见性
执行
直接操作主存
(1)本线程可以看到其他线程写入的最新结果
(2)其他线程也可以看到本线程写入的最新结果
线程安全
什么是线程安全?
怎样保证?
原则
保证对象的引用、状态对其他线程正确可见
保证对象状态操作的正确性
怎么达到上述原则?
明确共享资源
类变量
实例变量
明确共享资源的操作方式
哪些变量只需要保证引用、状态的可见性
除可见性外,哪些变量还需要保证操作的互斥性
选择适合种类的对象
不变对象
基本不变对象
可变对象
ThreadLocal
线程变量隔离
防止OOM
set
get
remove
J.U.C包
线程池
工作线程
任务队列
协调线程的机制
并发集合
将协调机制内置
锁
公平、非公平锁
一锁多条件
原子操作
引入乐观锁机制
辅助类
线程间协调
锁
分类
分类1
乐观锁
悲观锁
分类2
公平锁
非公平锁
分类3
可重入锁
不可重入锁
悲观锁
内置
synchronized
J.U.C
ReentrantLock
比较
相同
悲观锁
可重入
不同
内置:非公平锁
J.U.C:公平锁、非公平锁
乐观锁
CAS
内存值
旧值
新值
和悲观锁比较
自旋设置新值
不需上下文切换
并发高时,CPU会占用过高
条件变量
三要素
锁
等待条件
等待队列
内置
锁
synchronized
等待条件满足时调用方法
wait
notify
notifyAll
等待队列
等待在synchronized的对象上
J.U.C
锁
Lock
等待条件满足时调用方法
Condition.await
Condition.singal
Condition.singalAll
等待队列
等待在Condition上
一个Lock可以有多个Condition
线程活跃度
死锁
锁序一致
锁饥饿
非公平锁
活锁
不正确的重试
性能
怎样提高?
减少锁的范围
减小锁的粒度
减少上下文切换
怎样测试?
测试陷井
垃圾回收充分
要动态编译成本地码
代码执行路径、线程竞争程序要与真实情况尽量一致
要注意dead code优化
工具
J.U.C
CountDown
CylicBarrier
ConTest
jucprofiler
JMM
指令重排
javac生成字节码时
字节码被JIT编译成本地码时
处理器乱序、并发执行指令
JMM规则
为什么要有这些规则?
保证代码的执行是可预测的
happens-before
可见性规则(变量的顺序可见性)
偏序关系
规则
(1)同一个线程中的每个action都happens-before于出现在其后的任何一个action
(2)对一个monitor的解锁happens-before于每一个后续对同一个monitor的加锁
(3)对volatile字段的写入操作happens-before于每一个后续的同一个字段的读操作
(4)Thread.start()的调用会happens-before于启动线程里面的动作
(5)Thread中的所有动作都happens-before于其他线程检查到此线程结束或者Thread.join()中返回或者Thread.isAlive()==false
(6)一个线程调用另一个线程的interrupt happens-before于被中断的线程发现中断(通过抛出InterruptedException,或者调用isInterrupted和interrupted)
(7)一个对象构造函数的结束happens-before与该对象的finalizer的开始
(8)如果A动作happens-before于B动作,而B动作happens-before与C动作,那么A动作happens-before于C动作
利用happens-before分析代码
final
可见性规则(对象状态的可见性)
规则
所有线程都能看到final域的值
所有线程都能看到任何通过final域触及到的变量(一个final的数组中的元素,一个final的HashMap中的元素)
附录
JSR
JSR是指向JCP提出新增标准化技术规范的正式请求,以向Java平台增添新的API和服务
JSR-166
JSR-166主要是关于J.U.C的技术规范(jdk5)
JSR-166x(jdk6新增类:Deques、Navigable collections)
JSR-166y(jdk7新特性:fork-join)
更多研究的主题
线程与GC
线程与ClassLoader
线程与安全
并发算法
参考资料
Java Concurrency in Practice
Java Thread
Effective-Java
JDK 5.0 Documentation
动态编译与性能测量
安全构造技术
volatile的使用
Java 理论与实践: 变还是不变?
剖析java.util.concurrent锁
使用 ConTest 进行多线程单元测试