- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
第
Java读写锁ReadWriteLock原理与应用场景详解
什么是读写锁?
读写锁并不是JAVA所特有的读写锁(Readers-WriterLock)顾名思义是一把锁分为两部分:读锁和写锁,其中读锁允许多个线程同时获得,因为读操作本身是线程安全的,而写锁则是互斥锁,不允许多个线程同时获得写锁,并且写操作和读操作也是互斥的。
所谓的读写锁(Readers-WriterLock),顾名思义就是将一个锁拆分为读锁和写锁两个锁。
其中读锁允许多个线程同时获得,而写锁则是互斥锁,不允许多个线程同时获得写锁,并且写操作和读操作也是互斥的。
为什么需要读写锁?
Synchronized和ReentrantLock都是独占锁,即在同一时刻只有一个线程获取到锁。
然而在有些业务场景中,我们大多在读取数据,很少写入数据,这种情况下,如果仍使用独占锁,效率将及其低下。
针对这种情况,Java提供了读写锁ReentrantReadWriteLock。
主要解决:对共享资源有读和写的操作,且写操作没有读操作那么频繁的场景。
读写锁的特点
公平性:读写锁支持非公平和公平的锁获取方式,非公平锁的吞吐量优于公平锁的吞吐量,默认构造的是非公平锁可重入:在线程获取读锁之后能够再次获取读锁,但是不能获取写锁,而线程在获取写锁之后能够再次获取写锁,同时也能获取读锁锁降级:线程获取写锁之后获取读锁,再释放写锁,这样实现了写锁变为读锁,也叫锁降级
读写锁的使用场景
ReentrantReadWriteLock适合读多写少的场景:
读锁ReentrantReadWriteLock.ReadLock可以被多个线程同时持有,所以并发能力很高。
写锁ReentrantReadWriteLock.WriteLock是独占锁,在一个线程持有写锁时候,其他线程都不能在抢占,包含抢占读锁都会阻塞。
ReentrantReadWriteLock的使用场景总结:其实就是读读并发、读写互斥、写写互斥而已,如果一个对象并发读的场景大于并发写的场景,那就可以使用ReentrantReadWriteLock来达到保证线程安全的前提下提高并发效率。
读写锁的主要成员和结构图
1.ReentrantReadWriteLock的继承关系
publicinterfaceReadWriteLock{
*Returnsthelockusedforreading.
*@returnthelockusedforreading.
LockreadLock();
*Returnsthelockusedforwriting.
*@returnthelockusedforwriting.
LockwriteLock();
}
读写锁ReadWriteLock
读写锁维护了一对相关的锁,一个用于只读操作,一个用于写入操作。
只要没有写入,读取锁可以由多个读线程同时保持,写入锁是独占的。
2.ReentrantReadWriteLock的核心变量
ReentrantReadWriteLock类包含三个核心变量:
ReaderLock:读锁,实现了Lock接口WriterLock:写锁,也实现了Lock接口Sync:继承自AbstractQueuedSynchronize(AQS),可以为公平锁FairSync或非公平锁NonfairSync
3.ReentrantReadWriteLock的成员变量和构造函数
/**内部提供的读锁*/
privatefinalReentrantReadWriteLock.ReadLockreaderLock;
/**内部提供的写锁*/
privatefinalReentrantReadWriteLock.WriteLockwriterLock;
/**AQS来实现的同步器*/
finalSyncsync;
*Createsanew{@codeReentrantReadWriteLock}with
*默认创建非公平的读写锁
publicReentrantReadWriteLock(){
this(false);
*Createsanew{@codeReentrantReadWriteLock}with
*thegivenfairnesspolicy.
*
文档评论(0)