| 1、一般应用,都是读多写少,ReentrantReadWriteLock 因读写互斥,故读时阻塞写,因而性能上上不去。可能会使写线程饥饿 |
| 2、StampedLock的特点 |
| 所有获取锁的方法,都返回一个邮戳(Stamp),Stamp为0表示获取失败,其余都表示成功; |
| 所有释放锁的方法,都需要一个邮戳(Stamp),这个Stamp必须是和成功获取锁时得到的Stamp一致; |
| StampedLock是不可重入的;(如果一个线程已经持有了写锁,再去获取写锁的话就会造成死锁) 支持锁升级跟锁降级 |
| 可以乐观读也可以悲观读 |
| 使用有限次自旋,增加锁获得的几率,避免上下文切换带来的开销 |
| 乐观读不阻塞写操作,悲观读,阻塞写得操作 |
| 3、StampedLock的优点 |
| 相比于ReentrantReadWriteLock,吞吐量大幅提升 |
| 4、StampedLock的缺点 |
| api相对复杂,容易用错 内部实现相比于ReentrantReadWriteLock复杂得多 |
| 5、StampedLock的原理 |
| 每次获取锁的时候,都会返回一个邮戳(stamp),相当于mysql里的version字段 释放锁的时候,再根据之前的获得的邮戳,去进行锁释放 |
| 6、使用stampedLock注意点 |
| 如果使用乐观读,一定要判断返回的邮戳是否是一开始获得到的,如果不是,要去获取悲观读锁,再次去读取 |
| |
| public class StampedLockDemo { |
| |
| private double x, y; |
| |
| |
| private final StampedLock sl = new StampedLock(); |
| |
| |
| void move(double deltaX, double deltaY) { |
| |
| long stamp = sl.writeLock(); |
| |
| try { |
| x += deltaX; |
| y += deltaY; |
| } finally { |
| |
| sl.unlockWrite(stamp); |
| } |
| } |
| |
| |
| double distanceFromOrigin() { |
| |
| long stamp = sl.tryOptimisticRead(); |
| |
| double currentX = x, currentY = y; |
| |
| if (!sl.validate(stamp)) { |
| |
| stamp = sl.readLock(); |
| try { |
| |
| currentX = x; |
| currentY = y; |
| } finally { |
| |
| sl.unlockRead(stamp); |
| } |
| } |
| |
| return Math.sqrt(currentX * currentX + currentY * currentY); |
| } |
| |
| |
| void moveIfAtOrigin(double newX, double newY) { |
| |
| long stamp = sl.readLock(); |
| try { |
| |
| while (x == 0.0 && y == 0.0) { |
| |
| long ws = sl.tryConvertToWriteLock(stamp); |
| |
| if (ws != 0L) { |
| stamp = ws; |
| x = newX; |
| y = newY; |
| break; |
| } else { |
| |
| sl.unlockRead(stamp); |
| stamp = sl.writeLock(); |
| } |
| } |
| } finally { |
| |
| sl.unlock(stamp); |
| } |
| } |
| |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)