在加读锁之前,先尝试进行乐观读,根据获取的戳进行校验,若通过,则数据合法安全,否则升级锁为读锁,再进行相关操作。相关代码如下:

public class TestLock {public static void main(String[] args) {DataContainer<Long>dataContainer=new DataContainer<>(1000L);new Thread(()->{try {dataContainer.read(1000L);} catch (InterruptedException e) {e.printStackTrace();}},"t1").start();new Thread(()->{try {dataContainer.read(1000L);} catch (InterruptedException e) {e.printStackTrace();}},"t2").start();new Thread(()->{try {dataContainer.write(1000L);} catch (InterruptedException e) {e.printStackTrace();}},"t3").start();}}
class DataContainer<T>{private T Data;private final StampedLock stampedLock=new StampedLock();public DataContainer(T data) {Data = data;}public T read(T readTime) throws InterruptedException {long stamp=stampedLock.tryOptimisticRead();System.out.println(Thread.currentThread().getName()+",尝试乐观读.."+stamp);Thread.sleep((Long)readTime);if(stampedLock.validate(stamp)){System.out.println(Thread.currentThread().getName()+",读取完成"+stamp);return Data;}//锁升级stamp=stampedLock.readLock();try{System.out.println(Thread.currentThread().getName()+",获取读锁"+stamp+",time:"+System.currentTimeMillis());Thread.sleep((Long)readTime);System.out.println(Thread.currentThread().getName()+",读入完成"+stamp+",time:"+System.currentTimeMillis());return Data;}finally {System.out.println(Thread.currentThread().getName()+",释放读锁"+stamp+",time:"+System.currentTimeMillis());stampedLock.unlockRead(stamp);}}public void write(T data) throws InterruptedException {long stamp=stampedLock.writeLock();System.out.println(Thread.currentThread().getName()+",获取写锁.."+stamp+",time:"+System.currentTimeMillis());try{Thread.sleep((Long)data);this.Data=data;}finally {System.out.println(Thread.currentThread().getName()+",释放写锁..."+stamp+",time:"+System.currentTimeMillis());stampedLock.unlockWrite(stamp);}}
}

Stamped读写锁相关推荐

  1. java锁(公平锁和非公平锁、可重入锁(又名递归锁)、自旋锁、独占锁(写)/共享锁(读)/互斥锁、读写锁)

    前言 本文对Java的一些锁的概念和实现做个整理,涉及:公平锁和非公平锁.可重入锁(又名递归锁).自旋锁.独占锁(写)/共享锁(读)/互斥锁.读写锁 公平锁和非公平锁 概念 公平锁是指多个线程按照申请 ...

  2. ReentrantReadWriteLock读写锁的使用

    Lock比传统线程模型中的synchronized方式更加面向对象,与生活中的锁类似,锁本身也应该是一个对象.两个线程执行的代码片段要实现同步互斥的效果,它们必须用同一个Lock对象. 读写锁:分为读 ...

  3. golang:1.并发编程之互斥锁、读写锁详解

    本文转载自junjie,而后稍作修改. 一.互斥锁 互斥锁是传统的并发程序对共享资源进行访问控制的主要手段.它由标准库代码包sync中的Mutex结构体类型代表.sync.Mutex类型(确切地说,是 ...

  4. Linux多线程的同步------读写锁

    前面介绍过Linux多线程同步的另外两个方法------互斥锁和信号量 Linux多线程的同步-----信号量和互斥锁_神厨小福贵!的博客-CSDN博客 下面来看一下读写锁: 读写锁和互斥锁都带有一个 ...

  5. 互斥量、读写锁长占时分析的利器——valgrind的DRD

    在进行多线程编程时,我们可能会存在同时操作(读.写)同一份内存的可能性.为了保证数据的正确性,我们往往会使用互斥量.读写锁等同步方法.(转载请指明出于breaksoftware的csdn博客) 互斥量 ...

  6. Linux多线程实践(6) --Posix读写锁解决读者写者问题

    Posix读写锁 int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock,const pthread_rwlockattr_t *restr ...

  7. ReentrantReadWriteLock(读写锁)

    为了提高性能,java提供了读写锁, 读锁: 在读的地方使用读锁,可以多个线程同时读. 写锁: 在写的地方使用写锁,只要有一个线程在写,其他线程就必须等待 例子: public static Read ...

  8. Java并发- 读写锁中的性能之王:StampedLock

    为什么StampedLock这么神奇?能够达到这种效果,它的核心思想在于,在读的时候如果发生了写,应该通过重试的方式来获取新的值,而不应该阻塞写操作.这种模式也就是典型的无锁编程思想,和CAS自旋的思 ...

  9. 嵌入式 自旋锁、互斥锁、读写锁、递归锁

    互斥锁(mutexlock): 最常使用于线程同步的锁:标记用来保证在任一时刻,只能有一个线程访问该对象,同一线程多次加锁操作会造成死锁:临界区和互斥量都可用来实现此锁,通常情况下锁操作失败会将该线程 ...

最新文章

  1. 好久没更新日志了啊~!!今天发一个AS3的播放器
  2. Algs4-1.4.12找出两个有序数组的公共元素-方法1
  3. 论文浅尝 | 实体图的预览表格生成
  4. java防止上传恶意文件_从补丁分析到在野利用:揭秘CVE20201464 Windows文件签名验证绕过漏洞疑云...
  5. 人工神工机器人是什么_为什么企业要用电销机器人代理人工
  6. DSDV的问题(Problems of DSDV)
  7. javaweb功能模块如何合理设计_燃油燃气锅炉烟道如何设计才更合理?
  8. 还不会用typedef?C语言typedef的详细用法总结,一篇解决你的困惑。(学习笔记2--typedef设置别名)
  9. 西瓜书+实战+吴恩达机器学习(十四)无监督学习之聚类(k-means, LVQ, 高斯混合聚类, DBSCAN, AGNES)
  10. count是java关键字吗_countinue关键字和break关键字与java基本格式
  11. 扇贝python课程免费_扇贝新推出的python课程值得买吗?
  12. 关于get和post的区别
  13. Android PDF 的 读取 与 生成
  14. Windows10的启动项管理
  15. 哈夫曼编码与哈夫曼树
  16. redis雪崩 击穿 穿透
  17. 【C语言代码写圣诞节程序】别再画圣诞树了,看都看腻了
  18. ImageNet一作、李飞飞高徒邓嘉获最佳论文奖,ECCV 2020奖项全公布
  19. TranUnet 复现[Errno 2] No such file or directory: ‘./model/TU_Synapse224/TU_pretrain_ViT-B_16_skip3_ep
  20. 关闭rabbitmq连接健康检查

热门文章

  1. matlab精华(转)
  2. Intel 工具vtune的安装和使用
  3. Tomcat的卸载和安装
  4. 12.0 自定义SystemUI下拉状态栏和通知栏视图(二十)之锁屏通知布局
  5. 汉语字典API接口,免费好用
  6. 访问非法内存区和内存泄漏
  7. Facebook营销常犯的错误,看看你中招了吗?
  8. srm供应商关系管理系统
  9. 质量控制中的常见误区(1): Cr=0
  10. 基于端口的信息探测-portscan-1.0