文档章节

ReentrantReadWriteLock类的使用

writeademo
 writeademo
发布于 2017/01/06 17:14
字数 415
阅读 3
收藏 0

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

可重入读写锁

ReentrantReadWriteLock类的使用

ReentrantLock只能有一个线程执行lock后的方法,这样的效率很低;

ReentrantReadWriteLock类可以加快运行,读操作相关的锁称为共享锁,写操作相关的锁,也称为排他锁

多个读锁之间不互斥,读锁和写锁互斥,写锁和写锁互斥,就是多个Thread可以同时进行读取操作,但是同一时刻只允许一个Thread进行写入操作.

 

读读共享

代码:

public class Service {

         private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();



         public void read() {

                   try {

                            try {

                                     lock.readLock().lock();

                                     System.out.println("获得读锁" + Thread.currentThread().getName() + ":" + System.currentTimeMillis());

                                     Thread.sleep(10000);

                            } finally {

                                     lock.readLock().unlock();

                            }

                   } catch (Exception e) {

                            e.printStackTrace();

                   }

         }

}public class ThreadA extends Thread {

         private Service service;



         public ThreadA(Service service) {

                   super();

                   this.service = service;

         }



         public void run() {

                   service.read();

         }

}



public class ThreadB extends Thread {

         private Service service;



         public ThreadB(Service service) {

                   super();

                   this.service = service;

         }



         public void run() {

                   service.read();

         }

}



public class Run {

         public static void main(String[] args) {

                   Service service = new Service();

                   ThreadA a = new ThreadA(service);

                   a.setName("A");

                   ThreadB b = new ThreadB(service);

                   b.setName("B");

                   a.start();

                   b.start();

         }

}

 

结果:这两个方法几乎同时进入lock()后面的代码,说明允许同时执行lock()方法后面的代码;

 

写写互斥:

lock.writeLock().lock()

结果:同一时间只能有一个线程执行lock()后面的方法;

读写互斥:

例子

结果:读写互斥,只能有一个线程获得锁;写读也互斥;

 

可以使用Lock对象将synchronized关键字替换掉。其独特的功能也是synchronized不具有的。

 

 

 

© 著作权归作者所有

writeademo
粉丝 25
博文 704
码字总数 268781
作品 0
东城
私信 提问
ReentrantReadWriteLock读写锁及其在 RxCache 中的使用

一. ReentrantReadWriteLock读写锁 Lock 是相当于 synchronized 更面向对象的同步方式,ReentrantLock 是 Lock 的实现。 本文要介绍的 ReentrantReadWriteLock 跟 ReentrantLock 并没有直接的...

fengzhizi715
01/21
0
0
关于concurrent包 线程池、资源封锁和队列、ReentrantReadWriteLock介绍

jdk1.5后,提供了java.util.concurrent包,它可以实现线程池,你把线程当成普通对象就可以了,它来负责调度和执行 包括两类线程池 固定线程池 可变线程池 延迟线程池 固定线程池 public sta...

JavaGG
2009/06/11
1K
1
concurrent包 线程池、资源封锁和队列、ReentrantReadWriteLock介绍

jdk1.5后,提供了java.util.concurrent包,它可以实现线程池,你把线程当成普通对象就可以了,它来负责调度和执行 包括两类线程池 固定线程池 可变线程池 延迟线程池 固定线程池 public sta...

JavaGG
2010/03/24
984
0
Java并发学习(十三)-ReentrantReadWriteLock学习

这篇文章主要来讲讲,他与 有点联系,甚至说,它可以代替出现,从名字上面可以看出,它提供了读锁和写锁。 What is ReentrantReadWriteLock 读写锁,记得学习AbstractQueuedSynchronizer的时...

anLA_
2017/12/04
0
0
AbstractQueuedSynchronizer在工具类Semaphore、CountDownLatch、ReentrantLock中的应用和CyclicBarrier

在上篇文章本人粗略地整理了AbstractQueuedSynchronizer和ReentrantLock的源码要点。其实,在java.util.concurrent包中,AbstractQueuedSynchronizer的应用非常广泛,而不局限于在Reentrant...

pczhangtl
2013/11/18
83
0

没有更多内容

加载失败,请刷新页面

加载更多

ArrayList 源码分析

一、概述 本文基于 JDK8 ArrayList 底层通过动态数组的数据结构实现 内存需要连续的空间保证 添加操作涉及到数组的动态扩容 添加,删除都涉及到位置移动操作 随机查找效率快(下标查找) Ar...

hncboy
今天
4
0
采购单品汇总_华南.xlsx

import pandas as pdimport matplotlib.pyplot as pltimport matplotlib as mp1mp1.rcParams["font.family"] = "STFangsong"# 加载《销售》表数据df1 = pd.read_excel(r"C:\Us......

龙玉滕
今天
5
0
OSChina 周五乱弹 —— 一次四千 要4次还能多给一千

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @这次装个文艺青年吧 :#今日歌曲推荐# 分享金志文的单曲《远走高飞》: 版权又回来了现在听歌得好几个软件 《远走高飞》- 金志文 手机党少年们...

小小编辑
今天
11
0
Spring Cloud Alibaba 实战(十) - Spring Cloud GateWay

> 本文主要内容是:为什么要使用网关,整合Gateway,Gateway核心学习:Route,Predicate,Filter,最后使用Gateway聚合微服务请求 先总结至此的架构 1 网关的价值 不使用网关行嘛? 各个请求直接打在...

JavaEdge
今天
4
0
【CKB.DEV 茶话会】第二期:聊聊 CKB 钱包和 Nervos DAO 全流程

CKB.DEV 茶话会第二期:聊聊 CKB 钱包和 Nervos DAO 全流程 为了鼓励更多优秀的开发者和研究人员参与到 CKB 的开发和生态建设中去,我们希望组织一系列 CKB Developer Seminar(CKB.DEV 茶话...

NervosCommunity
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部