博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java多线程进阶(四)—— J.U.C之locks框架:ReentrantReadWriteLock
阅读量:6228 次
发布时间:2019-06-21

本文共 2180 字,大约阅读时间需要 7 分钟。

b886e976d8d35e0a0332a37980ac74f8.jpeg

本文首发于一世流云的专栏:

一、ReentrantReadWriteLock类简介

ReentrantReadWriteLock类,顾名思义,是一种读写锁,它是的直接实现,该类在内部实现了具体独占锁特点的写锁,以及具有共享锁特点的读锁,和ReentrantLock一样,ReentrantReadWriteLock类也是通过定义内部类实现AQS框架的API来实现独占/共享的功能。

ReentrantReadWriteLock类具有如下特点:

1.1 支持公平/非公平策略

与ReadWriteLock类一样,ReentrantReadWriteLock对象在构造时,可以传入参数指定是公平锁还是非公平锁。

image.png

1.2 支持锁重入

  • 同一读线程在获取了读锁后还可以获取读锁;
  • 同一写线程在获取了写锁之后既可以再次获取写锁又可以获取读锁;

1.3 支持锁降级

所谓锁降级,就是:先获取写锁,然后获取读锁,最后释放写锁,这样写锁就降级成了读锁。但是,读锁不能升级到写锁。简言之,就是:

写锁可以降级成读锁,读锁不能升级成写锁。

1.4 Condition条件支持

ReentrantReadWriteLock的内部读锁类、写锁类实现了Lock接口,所以可以通过newCondition()方法获取Condition对象。但是这里要注意,读锁是没法获取Condition对象的,读锁调用newCondition() 方法会直接抛出UnsupportedOperationException

我们知道,condition的作用其实是对Object类的
wait()
notify()的增强,是为了让线程在指定对象上等待,是一种线程之间进行协调的工具。
当线程调用condition对象的
await方法时,必须拿到和这个condition对象关联的锁。由于线程对读锁的访问是不受限制的(在写锁未被占用的情况下),那么即使拿到了和读锁关联的condition对象也是没有意义的,因为读线程之前不需要进行协调。

1.5 使用示例

以下是Oracle官方给出的一个例子:

使用ReentrantReadWriteLock控制对TreeMap的访问(利用读锁控制读操作的访问,利用写锁控制修改操作的访问),将TreeMap包装成一个线程安全的集合,并且利用了读写锁的特性来提高并发访问。

public class RWTreeMap {    private final Map
m = new TreeMap
(); private final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock(); private final Lock r = rwl.readLock(); private final Lock w = rwl.writeLock();  public Data get(String key) { r.lock(); try { return m.get(key); } finally { r.unlock(); } }  public String[] allKeys() { r.lock(); try { return (String[]) m.keySet().toArray(); } finally { r.unlock(); } }  public Data put(String key, Data value) { w.lock(); try { return m.put(key, value); } finally { w.unlock(); } }  public void clear() { w.lock(); try { m.clear(); } finally { w.unlock(); } }}

二、ReentrantReadWriteLock类/方法声明

2.1 类声明

image.png

内部嵌套类声明:

ReentrantReadWriteLock类有两个内部嵌套类ReadLockWriteLock,这两个内部类的实例会在ReentrantReadWriteLock类的构造器中创建,并通过ReentrantReadWriteLock类的readLock()writeLock()方法访问。

ReadLock:

image.png

WriteLock:

image.png

2.2 方法声明

ReentrantReadWriteLock类的核心方法其实就两个:readLock()writeLock(),其它都是一些用来监控系统状态的方法,返回的都是某一时刻点的近似值。

image.png

转载地址:http://zsxna.baihongyu.com/

你可能感兴趣的文章
python批量生成图片_python日常实用技能:如何利用Python批量生成任意尺寸的图片...
查看>>
python爱好者社区公众号历史文章合集_GitHub - thinkingpy/weixin_crawler: 高效微信公众号历史文章和阅读数据爬虫powered by scrapy...
查看>>
ranger安装hbase插件_ranger的配置与使用
查看>>
mysql模板文件_MySQL 配置文件模板
查看>>
mysql连接数据库测试连接成功_java连接mysql数据库及测试是否连接成功的方法
查看>>
1×pbs缓冲液配方_PBS缓冲液配方.doc
查看>>
mysql qadir_MySQL 及 SQL 注入
查看>>
python 播放视频 ftp_视频在通过Python ftplib上传时出现损坏
查看>>
python3 image_python docker快速入门3制作image
查看>>
python代码写名字_【python】【名字】是什么?,Pythonname
查看>>
python调用浏览器生成dom_1分钟快速生成用于网页内容提取的xslt
查看>>
tolua unity 报错_关于LUA+Unity开发_toLua篇【二】
查看>>
java this函数_java this 用法详解
查看>>
java怎么封装表单数据_java 对form表单数据进行封装list
查看>>
java 当前工作目录是指_java取得当前工作目录
查看>>
the java jive_Java Jive
查看>>
hadoop上传文件java_hadoop入门之通过java代码实现将本地文件上传到hadoop的文件系统...
查看>>
放苹果 java_用Java代码模拟实现:一个人不断往箱子里放苹果,另一个人不
查看>>
java ftp 判断目录存在_java判断ftp目录是否存在的方法
查看>>
java httpclient 进度条_如何获得一个文件的上传与Apache HttpClient的4进度条
查看>>