目录

一. 锁策略

1.1 什么是锁策略

1.2 悲观锁 vs 乐观锁 (加锁时遇到的场景)

1.3 重量级锁 vs 轻量级锁 (遇到某一种场景后的解决方案)

1.4 挂起等待锁 vs 自旋锁 (解决方案的典型实现)

1.5 普通互斥锁 vs 读写锁

1.6 可重入锁 vs 不可重入锁

1.7 公平锁 vs 非公平锁

二. synchronized的详细介绍

2.1 锁升级

2.2 锁消除

2.3 锁粗化

三. 总结


一. 锁策略

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 锁粗化

把一些连续的.细粒度的加锁优化成一次粗粒度的加锁.

[JAVAEE] 面试题(一) - 锁策略, synchronized的详细介绍-LMLPHP


三. 总结

10-29 00:10