目录
1.3 重量级锁 vs 轻量级锁 (遇到某一种场景后的解决方案)
一. 锁策略
1.1 什么是锁策略
锁在加锁的时候, 会有哪些特征和行为.
1.2 悲观锁 vs 乐观锁 (加锁时遇到的场景)
悲观锁: 加锁的时候, 预测接下来的锁竞争会非常激烈, 就需要针对这种情况做一些额外的工作.
乐观锁: 加锁的时候, 预测接下来的锁竞争不激烈, 就不需要做额外的工作.
1.3 重量级锁 vs 轻量级锁 (遇到某一种场景后的解决方案)
重量级锁: 在悲观的场景下, 需要付出更多的代价. => 更低效
轻量级锁: 在乐观的场景下, 付出更少的代价. => 更高效
1.4 挂起等待锁 vs 自旋锁 (解决方案的典型实现)
挂起等待锁: 操作系统内核级别的, 当前线程遇到锁竞争之后阻塞(不消耗cpu资源), 等待操作系统内核来唤醒. (锁竞争激烈, 一个线程阻塞后不知道什么时候能获取锁, 就挂起等待, 此时, 不消耗资源)
自旋锁: 应用程序级别的, 当前线程遇到锁竞争之后忙等(while...)(疯狂消耗cpu资源), 等待竞争结束.
(锁竞争不激烈, 一个线程阻塞后(没有真的阻塞, 而是忙等), 很快就可以获取锁, 就忙等)
1.5 普通互斥锁 vs 读写锁
synchronized是普通互斥锁: 加锁 解锁
读写锁: 读与读不互斥, 读与写互斥, 写与写互斥 因为读是线程安全的, 写是线程不安全的.(读多写少的场景)
1.6 可重入锁 vs 不可重入锁
synchronized是可重入锁.
ReentrantLock默认状态下是不可重入锁, 可以设置为可重入锁.
1.7 公平锁 vs 非公平锁
公平锁: 线程获取锁讲究先来后到.
非公平锁: 线程获取锁不要求先来后到.
二. synchronized的详细介绍
2.1 锁升级
无锁 => 偏向锁 => 轻量级自旋锁 => 重量级挂起等待锁
2.2 锁消除
jvm判断当前代码逻辑是否需要加锁, 若不需要, jvm就会优化代码(锁消除).
2.3 锁粗化
把一些连续的.细粒度的加锁优化成一次粗粒度的加锁.