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读写锁相关推荐

  1. JUC并发编程第十四篇,StampedLock(邮戳锁)为什么比ReentrantReadWriteLock(读写锁)更快!

    JUC并发编程第十四篇,StampedLock(邮戳锁)为什么比ReentrantReadWriteLock(读写锁)更快! 一.ReentrantReadWriteLock(读写锁) 1.读写锁存在 ...

  2. StampedLock 读写锁中的最强王者

    StampedLock 简介 我们前面介绍了 ReentrantReadWriteLock可重入读写锁详解,不过 jdk1.8 引入了性能更好的 StampedLock 读写锁,我愿称之为最强! 一种 ...

  3. Java 独占锁ReentrantLock、读(悲观读)写锁ReentrantReadWriteLock、读(乐观读/悲观读)写锁StampedLock

    1.AbstractQueuedSynchronizer 锁必然要知道AbstractQueuedSynchronizer(AQS),AQS提供了一个框架,用于实现依赖于先进先出(FIFO)等待队列的 ...

  4. java并发-ReentrantReadWriteLock读写锁

    一.概念 Java常见的多是排他锁,这些锁在同一时刻只允许一个线程进行访问,而读写锁在同一时刻可以允许多个读线程访问,但是在写线程访问时,所有的读线程和其他写线程均被阻塞.读写锁维护了一对锁,一个读锁 ...

  5. Java多线程编程之读写锁【ReentrantReadWriteLock】

    有时候我们需要有这样的需求:         对于同一个文件进行读和写操作,普通的锁是互斥的,这样读的时候会加锁,只能单线程的读,我们希望多线程的进行读操作,并且读的时候不能进行写操作,写的时候不能进 ...

  6. 读写锁ReentrantReadWriteLock:读读共享,读写互斥,写写互斥

    JDK1.5之后,提供了读写锁ReentrantReadWriteLock,读写锁维护了一对锁,一个读锁,一个写锁,通过分离读锁和写锁,使得并发性相比一般的排他锁有了很大提升.在读多写少的情况下,读写 ...

  7. 读写锁(ReentrantReadWriteLock)

    前言  在了解读写锁时,我们首先要明白什么是排他锁?在另个博客写有关于重入锁的测试,关于重入锁这些其实都属于排他锁,什么是排他锁呢?这种锁呢在同一时刻只允许一个线程进行访问,而读写锁在同一时刻可以允许 ...

  8. Java高并发编程(七):读写锁、LockSupport、Condition

    读写锁定义:读写锁在同一时刻可以允许多个读线程访问,但是在写线程访问时,所有的读 线程和其他写线程均被阻塞.读写锁维护了一对锁,一个读锁和一个写锁,通过分离读锁和写锁,使得并发性相比一般的排他锁有了很 ...

  9. 【线程、锁】什么是AQS(锁分类:自旋锁、共享锁、独占锁、读写锁)

    文章目录 1. 什么是AQS 1.1 锁分类 1.2 具体实现 2. AQS底层使用了模板方法模式 3. AQS的简单应用 参考 1. 什么是AQS AQS:全称为AbstractQuenedSync ...

最新文章

  1. spring_Spring Boot登录选项快速指南
  2. ffplay命令汇总
  3. 华为交换机ssh思科交换机_华为交换机 ssh 配置(极简版)
  4. Error解决:hive中的数组越界异常IndexOutOfBoundsException
  5. 什么是对象存储OSS-对象存储 OSS > 产品简介 > 什么是对象存储OSS
  6. python自制语音识别_今天的语音识别,我们就用Python来做,从基础的知识到实践的运用...
  7. 导出excel 数据取一次合理还是分页取合理_一张报表模板替代数百张Excel表格,用它让报表工作更轻松...
  8. 简单复制粘贴个linux红帽6
  9. RGB与16进制颜色值的相互转换
  10. elasticsearch 版本区别
  11. movsw 汇编_【汇编】 常用代码段 rep movsw/rep movsw
  12. 我的毕业旅行--Four night in beijing
  13. android自动调节背光,android自动调节背光
  14. 三位数自动递增编号函数_EXCEL中序号自动增加(如何避免隐藏行)?excel自动填充序号...
  15. java等待所有子线程执行完毕再执行
  16. 游戏项目框架(属性名+方法名)
  17. 卓聚社区,新发现的全能社区
  18. Java集合源码解析
  19. 【公示】关于举办“元宇宙数字人制作竞赛”的复函
  20. Windowbuilder中Swing的数据绑定

热门文章

  1. 基于ssm小说阅读安卓APP项目
  2. 你运营的公众号文章阅读量上不来,怎么回事?
  3. 我是如何用一行代码表白学妹~❤520情人节送女朋友的3D樱花雨相册礼物❤~(程序员表白专属)
  4. 485型传感器之数据回传进行CRC校验
  5. google 游戏下载
  6. 南京大学交叉培养计算机与金融招生人数,教务处组织召开计算机与金融工程实验班师生见面会...
  7. 2021全球程序员收入报告!字节高级码农年薪274万元排第5
  8. 直播带货app源码,实现直播的秒开和优化
  9. 类似捕鱼达人的金币效果
  10. 信息与计算机科学丛书,信息与计算科学丛书: 典藏版