4.6 Monitor 概念
结构
锁升级过程
原理基础:synchronized 是可重入、不公平的重量级锁,所以可以对其进行优化
可重入锁:线程可以进入任何一个它已经拥有的锁所同步着的代码块,可重入锁最大的作用是避免死锁
过程:无锁 -> 偏向锁 -> 轻量级锁 -> 重量级锁 ( 随着竞争的增加,只能锁升级,不能降级)
偏向锁
轻量级锁
使用场景:一个对象有多个线程要加锁,但加锁的时间是错开的(没有竞争),可以使用轻量级锁来优化,轻量级锁对使用者是透明的(不可见)
轻量级锁在没有竞争时(锁重入时),每次重入仍然需要执行 CAS 操作,Java 6 才引入的偏向锁来优化
重量级锁
锁消除、锁粗化
4.7 wait notify 原理
4.8 Park & Unpark
说明:它们是 LockSupport 类中的方法
暂停当前线程 LockSupport.park();
恢复某个线程的运行 LockSupport.unpark(暂停线程对象)
使用:
原理:类似生产者消费者
每个线程都有自己的一个 Parker 对象,由三部分组成 _counter , _cond 和 _mutex 打个比喻
线程就像一个旅人,Parker 就像他随身携带的背包,_cond条件变量就好比背包中的帐篷。_counter 就好比背包中的备用干粮(0 为耗尽,1 为充足)
4.9 重新理解线程状态转换
4.10 多把锁
4.11 活跃性
死锁
活锁
饥饿
一个线程由于优先级太低,始终得不到 CPU 调度执行,也不能够结束
4.12 ReentrantLock
相对于 synchronized
基本语法
可打断、可重入
锁超时
立刻失败
超时失败