学习目标:
掌握 lock 与 synchronized 的区别 理解 ReentrantLock 的公平、非公平锁 理解 ReentrantLock 中的条件变量 lock 与 synchronized 的区别有三个层面
学习内容:
1.不同点
语法层面
-
synchronized 是关键字,源码在 jvm 中,用 c++ 语言实现
-
Lock 是接口,源码由 jdk 提供,用 java 语言实现
-
使用 synchronized 时,退出同步代码块锁会自动释放,而使用 Lock 时,需要手动调用 unlock 方法释放锁
2.功能层面
-
二者均属于悲观锁、都具备基本的互斥、同步、锁重入功能
-
Lock 提供了许多 synchronized 不具备的功能,例如获取等待状态、公平锁、可打断、可超时、多条件变量
-
Lock 有适合不同场景的实现,如 ReentrantLock, ReentrantReadWriteLock
3.性能层面
4.公平锁
公平锁的公平体现
已经处在阻塞队列**中的线程(不考虑超时)始终都是公平的,先进先出
公平锁是指未处于阻塞队列中的线程来争抢锁,如果队列不为空,则老实到队尾等待
非公平锁是指未处于阻塞队列中的线程来争抢锁,与队列头唤醒的线程去竞争,谁抢到算谁的
公平锁会降低吞吐量,一般不用
5.条件变量
代码说明
day02.TestReentrantLock 用较为形象的方式演示
ReentrantLock 的内部结构
学习产出:
<font color=#999AAA
代码说明
day02.TestReentrantLock 用较为形象的方式演示
ReentrantLock 的内部结构