【学习笔记】深入理解Java虚拟机学习笔记——第13章 线程安全与锁优化
第13章 线程安全与锁优化
13.1 概述
略
13.2 线程安全
13.2.1 Java语言中的线程安全
1>不可变
final修饰的变量,及string、枚举类、Big Integer等不可修改对象
2>绝对线程安全
需维护快照等手段来保证线程绝对安全(包括循环)
3>相对线程安全
Java线程安全类大多为这个级别,只保证单次操作线程安全
4>线程兼容
Java API大多为线程兼容,Arraylist、HashMap等都需要在调用端实现线程安全
5>线程对立
调用时不管是否采取同步措施,都无法同步。
13.2.2 线程安全的实现方法
1>互斥同步
synchronized、lock(一个自旋、其余阻塞)时至今日,性能已相差不大。
2>非阻塞同步
CAS
3>无同步方案
一个请求对应一个线程的servlet API,就无需考虑线程同步问题,因为不与其他线程分享变量
13.3 锁优化
1>自旋
消耗处理器资源,但减少上下文切换,适合短时间获取到锁。
2>锁消除
操作对象不逃逸到方法及线程外的,可以不使用锁
3>锁粗化
在一段代码中不停加锁解锁,不如一次性先加最后再解,避免多次加解锁消耗
13.3.4 轻量级锁
CAS来获取锁,如果失败,且不是自己持有锁,则发生锁竞争,有竞争则变为重量级锁。
13.3.5 偏向锁
轻量级锁用CAS代替互斥量,而偏向锁使用无锁,如果一个线程反复持有锁,则干脆不加锁。
【如果大部分时间并发严重,那么偏向锁很多余,反而会影响性能】