Java主流锁
2020-11-27 17:48:42 1 举报
AI智能生成
Java锁 思维导图
作者其他创作
大纲/内容
1. 是否锁定同步资源?
悲观锁
持有数据就会加锁
实现
Synchronized
ReentrantLock
适用场景
根据实际业务情况
缺点
浪费cpu,执行效率低
占用资源,使其它线程无法工作
乐观锁
持有数据不会上锁,写入时适用cas判断
实现
版本号机制
cas实现
atomic
适用场景
读多写少
缺点
ABA问题
循环开销大
2. 锁住同步资源失败后,
线程是否阻塞?
线程是否阻塞?
阻塞
synchronized
ReentrantLock
Object的notify、notifyAll
Condition
LockSupport
synchronized
ReentrantLock
Object的notify、notifyAll
Condition
LockSupport
不阻塞
自旋锁
适应性自旋锁
自旋锁
实现
操作系统内核
TicketLock
CLHLock
MCSLock
优点
不需要线程切换
短时间占用cpu提高程序运行效率
缺点
无法保证锁的公平性
长时间占用锁,浪费cpu
适应性自旋锁
根据上次自旋锁定时间和锁状态决定
3. 锁的公平性
公平锁
轮流获取锁
ReentrantLock(可以选择公平、非公平)
非公平锁
先插队,插队失败后再排队
4. 一个线程的多个流程能否获取同一把锁?
可重入锁
对象锁
ReentrantLock
ReentrantReadWriteLock
适用场景???
对象锁
ReentrantLock
ReentrantReadWriteLock
非可重入锁
5. 多个线程能否共享一把锁
共享锁
ReentrantReadWriteLock的读锁
CountDownLatch
Semaphore
独占锁、排它锁
synchronized
ReentrantLock
ReentrantReadWriteLock的写锁
6. 多个线程竞争同步资源
(Synchronized实现细节)
(Synchronized实现细节)
无锁
不锁住资源,多线程访问只有一个能成功修改资源,其它线程会重试,
基于CAS实现,多次同一访问,锁会升级为偏向锁
基于CAS实现,多次同一访问,锁会升级为偏向锁
偏向锁
适用同一线程多次访问的情况,在对象头中存储ThreadID,
每次加锁进行检查,如果ThreadID相同,则直接获取资源,不用重复加锁,
多线程同时访问会升级为轻量级锁
每次加锁进行检查,如果ThreadID相同,则直接获取资源,不用重复加锁,
多线程同时访问会升级为轻量级锁
轻量级锁(自旋)
偏向锁阶段多个线程同时访问,会撤销偏向锁,
升级为轻量级锁,未获取资源的线程会自旋获取锁
升级为轻量级锁,未获取资源的线程会自旋获取锁
重量级锁
自旋到达一定次数还未获取锁,锁膨胀为重量级锁,线程阻塞等待唤醒
0 条评论
下一页