【Java并发】- StampedLock使用
来源:互联网 发布:知乎qq不能登陆了 编辑:程序博客网 时间:2024/06/03 04:02
StampedLock概述
StampedLock是从JDK1.8开始引入的,它的出现对于ReentrantReadWriteLock在读多写少的情况下的效率问题还有写线程容易产生“饥饿”的问题有了很大的解决。ReentrantReadWriteLock 在沒有任何读写锁时才能获取到写锁,StampedLock认为尝试获取读锁的时候如果有写锁存在不应该是阻塞而是重读,而且在StampedLock的乐观锁的情况下写锁可以直接“闯入”。
StampedLock使用了一个stamp的概念(可以就理解为时间戳),它可以被用作加锁解锁操作的一个票据。
StampedLock的三种状态
- 写入(Writing):writeLock方法获取独占式同步状态而阻塞当前线程,返回一个stamp,这个stamp能够在unlockWrite方法中使用从而释放锁。也提供了tryWriteLock。当锁被写模式所占有,读或者乐观的读操作都不能获取到同步状态。
- 读取(Reading):readLock方法获取共享式同步状态而阻塞随后的写线程,返回一个stamp变量,能够在unlockRead方法中用于释放锁。同时也提供了tryReadLock方法。
- 乐观读取(Optimistic Reading):提供了tryOptimisticRead方法返回一个非0的stamp,只有当前同步状态没有被写模式所占有是才能获取到。如果在获得stamp变量之后没有被写模式持有,方法validate将返回true。这种模式可以被看做一种弱版本的读锁,可以被一个写入者在任何时间打断。乐观读取模式仅用于短时间读取操作时经常能够降低竞争和提高吞吐量。同时使用的时候一般需要读取并存储到另外一个副本,以用做对比使用。
**注意:**StampedLock是不支持重入的。
StampedLock使用
下面是作者给出的使用例子:
class Point { 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; //调用validate来验证(如果被其他线程修改过了那么stamp就变了将返回false) 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); //如果ws不为零表示升级成功并获取到写锁 if (ws != 0L) { stamp = ws; x = newX; y = newY; break; } //升级失败释放读锁并直接使用写锁 else { sl.unlockRead(stamp); stamp = sl.writeLock(); } } } finally { //释放 sl.unlock(stamp); } }}
除了不支持重入之外,网上也有说StampedLock对于带着中断状态的线程将会使得CPU爆满的情况。除此之外StampedLock基本可以代替ReentrantReadWriteLock。
阅读全文
0 0
- 【Java并发】- StampedLock使用
- 【Java并发】- StampedLock实现浅析
- Java并发学习(十四)-StampedLock深入浅出
- StampedLock的使用
- Java 8的StampedLock
- 《Java高并发程序设计》学习 --6.6 读写锁的改进:StampedLock
- Java并发编程札记-(四)JUC锁-07读写锁的升级—StampedLock
- StampedLock
- java8新特性回顾(五)---并发增强之stampedLock
- Java Thread&Concurrency(9): 深入理解StampedLock及其实现原理
- Java 8:StampedLock,ReadWriteLock以及synchronized的比较
- Java多线程synchronized、ReentrantLock、ReentrantReadWriteLock 和StampedLock 的对比
- 【Java基础】线程笔记——显式锁StampedLock
- java8-StampedLock
- 【java并发】线程并发库的使用
- java并发:Semaphore 的使用
- java并发:CyclicBarrier的使用
- Java并发系列 ScheduledExecutorService 使用
- 【深入理解反向传播BP】Calculus on Computational Graphs: Backpropagation
- 阅读清单
- 模仿OKhttp框架Builder初始化数据,如何优雅地装逼
- Linux启动Tomcat服务器命令行
- 动态菜单(永远在屏幕的可视区域显示)
- 【Java并发】- StampedLock使用
- 《我的心曾悲伤七次》----卡里·纪伯伦 Kahlil Gibran
- [分享]浅谈分布式数据库
- mysql主从复制延迟问题
- 深度学习基础(六):LSTM模型及原理介绍
- servlet的本质是什么,它是如何工作的?
- springboot 404 -hello world遇到的错误
- 遗传算法的基本原理和方法
- 简谈PX4FLOW软硬件开源光流传感器