ReentrantReadWriteLock、StampedLock读写锁
1.ReentrantReadWriteLock
当读取操作远远高于写操作时,这时候使用读写锁让读-读可以并发(即然多个线程的读取是可以并行的),提高性能。
类似于数据库中的 select ... from ... lock in share mode
提供一个数据容器类,内部分别使用读锁保护数据的read()方法,写锁保护数据的write()方法
注意事项:
1.读锁不支持条件变量,写锁支持
2.重入时升级不支持,即同一个线程第一次获取的是读锁,然后又去获取写锁,会导致获取写锁永久等待(阻塞住了)
如下:
3.重入时支持降级:即先获取写锁,然后获取读锁。
2.StampedLock
该类自JDK8加入,是为了进一步优化读性能,它的特点是在使用读锁、写锁时都必须配合戳使用
加解读锁
long stamp = lock.readLock();
lock.unlockRead(stamp);
加解写锁
long stamp = lock.writeLock();
lock.unlockWrite(stamp);
乐观读,StampedLock支持tryOptimisticRead()方法(乐观读),读取完毕后需要做一次戳校验,如果校验通过,表示这期间确实没有写操作,数据可以安全使用,如果校验没有通过,需要重新获取读锁,保证数据安全。
long stamp = lock.tryOptimisticRead();
//验戳
if(!lock.validate(stamp)){
//锁升级
}
StampedLock的乐观读和普通的读锁的区别是:普通的读锁在多个线程同时读的时候,所有的写操作会被阻塞,而 StampedLock 提供的乐观读,是允许线程获取写锁的,也就是说不是所有的写操作都被阻塞,也就是说乐观读其实是无锁的。那具体要如何使用呢?我们来看一个简单的例子
public class DataContainerStamped {private int data;private final StampedLock lock = new StampedLock();public DataContainerStamped(int data) {this.data = data;}public int read(int readTime) throws InterruptedException {long stamp = lock.tryOptimisticRead();System.out.println("optimistic read locking ..."+stamp);Thread.sleep(readTime);//戳没有改变,即这段时间内没有其他线程进行写操作if (lock.validate(stamp)){System.out.println("read finish... "+stamp);return data;}//锁升级 - 读锁System.out.println("updating to read lock... "+stamp);try{stamp = lock.readLock();System.out.println("read lock... "+stamp);Thread.sleep(readTime);System.out.println("read finish... "+stamp);return data;}finally {System.out.println("read unlock "+stamp);//释放悲观读锁lock.unlockRead(stamp);}}public void write(int newData) throws InterruptedException{long stamp = lock.writeLock();System.out.println("write lock... "+stamp);try {Thread.sleep(2000);this.data = newData;} finally {System.out.println("write lock... "+stamp);lock.unlockWrite(stamp);}}}
比读写锁(ReadWriteLock)更快的锁(StampedLock)_weihubeats的博客-CSDN博客_比读写锁更快的锁
注意
* StampedLock 不支持条件变量(ReentrantReadWriteLock写锁支持)
* StampedLock 不支持可重入(ReentrantReadWriteLock支持降级不支持升级)
ReentrantReadWriteLock、StampedLock读写锁相关推荐
- JUC并发编程第十四篇,StampedLock(邮戳锁)为什么比ReentrantReadWriteLock(读写锁)更快!
JUC并发编程第十四篇,StampedLock(邮戳锁)为什么比ReentrantReadWriteLock(读写锁)更快! 一.ReentrantReadWriteLock(读写锁) 1.读写锁存在 ...
- StampedLock 读写锁中的最强王者
StampedLock 简介 我们前面介绍了 ReentrantReadWriteLock可重入读写锁详解,不过 jdk1.8 引入了性能更好的 StampedLock 读写锁,我愿称之为最强! 一种 ...
- Java 独占锁ReentrantLock、读(悲观读)写锁ReentrantReadWriteLock、读(乐观读/悲观读)写锁StampedLock
1.AbstractQueuedSynchronizer 锁必然要知道AbstractQueuedSynchronizer(AQS),AQS提供了一个框架,用于实现依赖于先进先出(FIFO)等待队列的 ...
- java并发-ReentrantReadWriteLock读写锁
一.概念 Java常见的多是排他锁,这些锁在同一时刻只允许一个线程进行访问,而读写锁在同一时刻可以允许多个读线程访问,但是在写线程访问时,所有的读线程和其他写线程均被阻塞.读写锁维护了一对锁,一个读锁 ...
- Java多线程编程之读写锁【ReentrantReadWriteLock】
有时候我们需要有这样的需求: 对于同一个文件进行读和写操作,普通的锁是互斥的,这样读的时候会加锁,只能单线程的读,我们希望多线程的进行读操作,并且读的时候不能进行写操作,写的时候不能进 ...
- 读写锁ReentrantReadWriteLock:读读共享,读写互斥,写写互斥
JDK1.5之后,提供了读写锁ReentrantReadWriteLock,读写锁维护了一对锁,一个读锁,一个写锁,通过分离读锁和写锁,使得并发性相比一般的排他锁有了很大提升.在读多写少的情况下,读写 ...
- 读写锁(ReentrantReadWriteLock)
前言 在了解读写锁时,我们首先要明白什么是排他锁?在另个博客写有关于重入锁的测试,关于重入锁这些其实都属于排他锁,什么是排他锁呢?这种锁呢在同一时刻只允许一个线程进行访问,而读写锁在同一时刻可以允许 ...
- Java高并发编程(七):读写锁、LockSupport、Condition
读写锁定义:读写锁在同一时刻可以允许多个读线程访问,但是在写线程访问时,所有的读 线程和其他写线程均被阻塞.读写锁维护了一对锁,一个读锁和一个写锁,通过分离读锁和写锁,使得并发性相比一般的排他锁有了很 ...
- 【线程、锁】什么是AQS(锁分类:自旋锁、共享锁、独占锁、读写锁)
文章目录 1. 什么是AQS 1.1 锁分类 1.2 具体实现 2. AQS底层使用了模板方法模式 3. AQS的简单应用 参考 1. 什么是AQS AQS:全称为AbstractQuenedSync ...
最新文章
- spring_Spring Boot登录选项快速指南
- ffplay命令汇总
- 华为交换机ssh思科交换机_华为交换机 ssh 配置(极简版)
- Error解决:hive中的数组越界异常IndexOutOfBoundsException
- 什么是对象存储OSS-对象存储 OSS > 产品简介 > 什么是对象存储OSS
- python自制语音识别_今天的语音识别,我们就用Python来做,从基础的知识到实践的运用...
- 导出excel 数据取一次合理还是分页取合理_一张报表模板替代数百张Excel表格,用它让报表工作更轻松...
- 简单复制粘贴个linux红帽6
- RGB与16进制颜色值的相互转换
- elasticsearch 版本区别
- movsw 汇编_【汇编】 常用代码段 rep movsw/rep movsw
- 我的毕业旅行--Four night in beijing
- android自动调节背光,android自动调节背光
- 三位数自动递增编号函数_EXCEL中序号自动增加(如何避免隐藏行)?excel自动填充序号...
- java等待所有子线程执行完毕再执行
- 游戏项目框架(属性名+方法名)
- 卓聚社区,新发现的全能社区
- Java集合源码解析
- 【公示】关于举办“元宇宙数字人制作竞赛”的复函
- Windowbuilder中Swing的数据绑定
热门文章
- 基于ssm小说阅读安卓APP项目
- 你运营的公众号文章阅读量上不来,怎么回事?
- 我是如何用一行代码表白学妹~❤520情人节送女朋友的3D樱花雨相册礼物❤~(程序员表白专属)
- 485型传感器之数据回传进行CRC校验
- google 游戏下载
- 南京大学交叉培养计算机与金融招生人数,教务处组织召开计算机与金融工程实验班师生见面会...
- 2021全球程序员收入报告!字节高级码农年薪274万元排第5
- 直播带货app源码,实现直播的秒开和优化
- 类似捕鱼达人的金币效果
- 信息与计算机科学丛书,信息与计算科学丛书: 典藏版