读写锁之ReadWriteLock

你可能有这样一个疑问,Java SDK 并发包里为什么还有很多其他的工具类呢?原因很简单:分场景优化性能,提升易用性

接下来我们聊聊,针对读多写少这种并发场景,Java SDK 并发包提供了读写锁——ReadWriteLock

读写锁,并不是 Java 语言特有的,而是一个广为使用的通用技术,所有的读写锁都遵守以下三条,尤其注意第三条,之后我们讲跟其他锁的对比会用到。

基本原则:

1. 允许多个线程同时读共享变量;

2.只允许一个线程写共享变量;

3. 如果一个写线程正在执行写操作,此时禁止读线程读共享变量(读写锁不能同时存在)

互斥锁:

 

互斥锁


互斥锁


升降级


ReadWriteLock


读操作允许多个线程同时读共享变量

写操作是互斥的,当一个

线程在写共享变量的时候,是不允许其他线程执行写操作和读操作。


不允许升级,允许降级。

读锁不支持条件变量newCondition()

 

读写锁在读多写少场景下性能优于互斥锁的关键

总结:

读写锁类似于 ReentrantLock,也支持公平模式和非公平模式。读锁和写锁都实现了

java.util.concurrent.locks.Lock 接口,所以除了支持 lock() 方法外,tryLock()、

lockInterruptibly() 等方法也都是支持的。但是有一点需要注意,那就是只有写锁支持条件变量,

读锁是不支持条件变量的,读锁调用 newCondition() 会抛出 UnsupportedOperationException

异常

原文地址:https://www.cnblogs.com/amberJava/p/12355474.html

时间: 2024-11-08 01:15:33

读写锁之ReadWriteLock的相关文章

读写锁(ReadWriteLock)的使用

Definition 读写锁包含一对相关的锁,读锁用于只读操作,写锁用于写操作.读锁可能由多个读线程同时运行,写锁是唯一的. 读锁和写锁之间是互斥的,同一时间只能有一个在运行. Method 读写锁(ReadWriteLock)包含如下两个方法: 1.读锁 Lock readLock() 2.写锁 Lock writeLock() Example 示例代码: 1 /* 以下代码可以实现以下几点 2 * 1.多个线程可以并发的读数据,系统性能会得到提高 3 * 2.开始读数据的时候都要上读锁,当有

读写锁:ReadWriteLock

http://my.oschina.net/20076678/blog/173165 一.在JDK文档中关于读写锁的相关说明 ReadWriteLock 维护了一对相关的 锁 ,一个用于只读操作,另一个用于写入操作.只要没有 writer, 读取锁 可以由多个 reader 线程同时保持. 写入锁 是独占的.  所有 ReadWriteLock 实现都必须保证 writeLock 操作的内存同步效果也要保持与相关 readLock 的联系.也就是说,成功获取读锁的线程会看到写入锁之前版本所做的所

深入浅出 Java Concurrency (13): 锁机制 part 8 读写锁 (ReentrantReadWriteLock) (1)[转]

从这一节开始介绍锁里面的最后一个工具:读写锁(ReadWriteLock). ReentrantLock 实现了标准的互斥操作,也就是一次只能有一个线程持有锁,也即所谓独占锁的概念.前面的章节中一直在强调这个特点.显然这个特点在一定程度上面减低了吞吐量,实际上独占锁是一种保守的锁策略,在这种情况下任何“读/读”,“写/读”,“写/写”操作都不能同时发生.但是同样需要强调的一个概念是,锁是有一定的开销的,当并发比较大的时候,锁的开销就比较客观了.所以如果可能的话就尽量少用锁,非要用锁的话就尝试看能

JAVA 并发编程-读写锁之模拟缓存系统(十一)

在多线程中,为了提高效率有些共享资源允许同时进行多个读的操作,但只允许一个写的操作,比如一个文件,只要其内容不变可以让多个线程同时读,不必做排他的锁定,排他的锁定只有在写的时候需要,以保证别的线程不会看到数据不完整的文件.这时候就需要使用读写锁. /** * 简单读写锁demo * @author hejingyuan * */ public class ReadWriteLockTest { public static void main(String[] args) { final Queu

转发 :java线程:互斥锁与读写锁

原文链接:http://coolxing.iteye.com/blog/1236909 两种互斥锁机制: 1.synchronized 2.ReentrantLock ReentrantLock是jdk5的新特性,采用ReentrantLock可以完全替代替换synchronized传统的锁机制,而且采用ReentrantLock的方式更加面向对象,也更加灵活,网上有很多关于对比两者锁方式的文章,这里就不多口舌了,大家baidu.google一下就水落石出了.在本博客中也写关于这两种锁方式实现的

Java之——redis并发读写锁,使用Redisson实现分布式锁

原文:http://blog.csdn.net/l1028386804/article/details/73523810 1. 可重入锁(Reentrant Lock) Redisson的分布式可重入锁RLock Java对象实现了java.util.concurrent.locks.Lock接口,同时还支持自动过期解锁. [java] view plain copy public void testReentrantLock(RedissonClient redisson){ RLock lo

深入浅出 Java Concurrency (13): 锁机制 part 8 读写锁 (ReentrantReadWriteLock) (1)

从这一节开始介绍锁里面的最后一个工具:读写锁(ReadWriteLock). ReentrantLock 实现了标准的互斥操作,也就是一次只能有一个线程持有锁,也即所谓独占锁的概念.前面的章节中一直在强调这个特点.显然这个特点在一定程度上面减低了吞吐量,实际上独占锁是一种保守的锁策略,在这种情况下任何"读/读","写/读","写/写"操作都不能同时发生.但是同样需要强调的一个概念是,锁是有一定的开销的,当并发比较大的时候,锁的开销就比较客观了.所

读写锁 ReentrantReadWriteLock

一.读写锁 ReadWriteLock概念特点读写锁维护了一对相关的锁,一个用于只读操作,一个用于写入操作.只要没有writer,读取锁可以由多个reader线程同时保持.写入锁是独占的. 互斥锁[ReetrantLock]一次只允许一个线程访问共享数据,哪怕进行的是只读操作:读写锁[ReadWriteLock]允许对共享数据进行更高级别的并发访问:对于写操作,一次只有一个线程(write线程)可以修改共享数据,对于读操作,允许任意数量的线程同时进行读取.writer可以获取读取锁,但reade

读写锁ReadWriteLock和缓存实例

读写锁:多个读锁不互斥,读锁与些锁互斥,写锁与写锁互斥.即:读的时候不允许写,写的时候不允许读,可以同时读. synchronized关键字和普通的Lock构造的锁,会造成读与读之间的互斥,因此读写锁可提高性能. 例子1:三个线程同时对一个共享数据进行读写. import java.util.Random; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantRea