Stamped读写锁
在加读锁之前,先尝试进行乐观读,根据获取的戳进行校验,若通过,则数据合法安全,否则升级锁为读锁,再进行相关操作。相关代码如下:
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读写锁相关推荐
- java锁(公平锁和非公平锁、可重入锁(又名递归锁)、自旋锁、独占锁(写)/共享锁(读)/互斥锁、读写锁)
前言 本文对Java的一些锁的概念和实现做个整理,涉及:公平锁和非公平锁.可重入锁(又名递归锁).自旋锁.独占锁(写)/共享锁(读)/互斥锁.读写锁 公平锁和非公平锁 概念 公平锁是指多个线程按照申请 ...
- ReentrantReadWriteLock读写锁的使用
Lock比传统线程模型中的synchronized方式更加面向对象,与生活中的锁类似,锁本身也应该是一个对象.两个线程执行的代码片段要实现同步互斥的效果,它们必须用同一个Lock对象. 读写锁:分为读 ...
- golang:1.并发编程之互斥锁、读写锁详解
本文转载自junjie,而后稍作修改. 一.互斥锁 互斥锁是传统的并发程序对共享资源进行访问控制的主要手段.它由标准库代码包sync中的Mutex结构体类型代表.sync.Mutex类型(确切地说,是 ...
- Linux多线程的同步------读写锁
前面介绍过Linux多线程同步的另外两个方法------互斥锁和信号量 Linux多线程的同步-----信号量和互斥锁_神厨小福贵!的博客-CSDN博客 下面来看一下读写锁: 读写锁和互斥锁都带有一个 ...
- 互斥量、读写锁长占时分析的利器——valgrind的DRD
在进行多线程编程时,我们可能会存在同时操作(读.写)同一份内存的可能性.为了保证数据的正确性,我们往往会使用互斥量.读写锁等同步方法.(转载请指明出于breaksoftware的csdn博客) 互斥量 ...
- Linux多线程实践(6) --Posix读写锁解决读者写者问题
Posix读写锁 int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock,const pthread_rwlockattr_t *restr ...
- ReentrantReadWriteLock(读写锁)
为了提高性能,java提供了读写锁, 读锁: 在读的地方使用读锁,可以多个线程同时读. 写锁: 在写的地方使用写锁,只要有一个线程在写,其他线程就必须等待 例子: public static Read ...
- Java并发- 读写锁中的性能之王:StampedLock
为什么StampedLock这么神奇?能够达到这种效果,它的核心思想在于,在读的时候如果发生了写,应该通过重试的方式来获取新的值,而不应该阻塞写操作.这种模式也就是典型的无锁编程思想,和CAS自旋的思 ...
- 嵌入式 自旋锁、互斥锁、读写锁、递归锁
互斥锁(mutexlock): 最常使用于线程同步的锁:标记用来保证在任一时刻,只能有一个线程访问该对象,同一线程多次加锁操作会造成死锁:临界区和互斥量都可用来实现此锁,通常情况下锁操作失败会将该线程 ...
最新文章
- 好久没更新日志了啊~!!今天发一个AS3的播放器
- Algs4-1.4.12找出两个有序数组的公共元素-方法1
- 论文浅尝 | 实体图的预览表格生成
- java防止上传恶意文件_从补丁分析到在野利用:揭秘CVE20201464 Windows文件签名验证绕过漏洞疑云...
- 人工神工机器人是什么_为什么企业要用电销机器人代理人工
- DSDV的问题(Problems of DSDV)
- javaweb功能模块如何合理设计_燃油燃气锅炉烟道如何设计才更合理?
- 还不会用typedef?C语言typedef的详细用法总结,一篇解决你的困惑。(学习笔记2--typedef设置别名)
- 西瓜书+实战+吴恩达机器学习(十四)无监督学习之聚类(k-means, LVQ, 高斯混合聚类, DBSCAN, AGNES)
- count是java关键字吗_countinue关键字和break关键字与java基本格式
- 扇贝python课程免费_扇贝新推出的python课程值得买吗?
- 关于get和post的区别
- Android PDF 的 读取 与 生成
- Windows10的启动项管理
- 哈夫曼编码与哈夫曼树
- redis雪崩 击穿 穿透
- 【C语言代码写圣诞节程序】别再画圣诞树了,看都看腻了
- ImageNet一作、李飞飞高徒邓嘉获最佳论文奖,ECCV 2020奖项全公布
- TranUnet 复现[Errno 2] No such file or directory: ‘./model/TU_Synapse224/TU_pretrain_ViT-B_16_skip3_ep
- 关闭rabbitmq连接健康检查