Java中的读写锁ReadWriteLock

ReadWriteLock 是 JDK 中的读写锁接口

ReentrantReadWriteLock 是 ReadWriteLock 的一种实现

读写锁非常适合读多写少的场景。读写锁与互斥锁的一个重要区别是读写锁允许多个线程同时读共享变量,这是读写锁在读多写少的情况下性能较高的原因。

读写锁的原则:

  • 多个线程可同时读共享变量
  • 只允许一个线程写共享变量
  • 写线程正在执行写操作,禁止其他线程读写共享变量

升级与降级:

  • ReadWriteLock 不支持锁的升级。即线程先获得读锁,再获取写锁,这样会导致死锁
  • ReadWriteLock 支持锁的降级。即先获取写锁,再获取读锁,释放写锁,释放读锁
  • ReadWriteLock 中只有写锁支持条件变量,读锁调用 newCondition() 方法,会抛出 UnsupportedOperationException 异常

读写锁的应用示例:

1package constxiong.interview; 2 3import java.util.concurrent.locks.Lock; 4import java.util.concurrent.locks.ReadWriteLock; 5import java.util.concurrent.locks.ReentrantReadWriteLock; 6 7/** 8 * 测试 读写锁 9 * @author ConstXiong 10 * @date 2019-12-19 10:40:45 11 */ 12public class TestReadWriteLock { 13 14 final static ReadWriteLock rwLock = new ReentrantReadWriteLock(); 15 16 final static Lock readLock = rwLock.readLock();//读锁 17 18 final static Lock writeLock = rwLock.writeLock();//写锁 19 20 static int count = 0; 21 22 public static void main(String[] args) { 23 for (int i = 0; i < 100; i++) { 24 new Thread(() -> { 25 System.out.println(Thread.currentThread().getName() + ":" + get()); 26 }).start(); 27 } 28 29 for (int i = 0; i < 3; i++) { 30 new Thread(() -> { 31 System.out.println(Thread.currentThread().getName() + " add"); 32 add(); 33 }).start(); 34 } 35 } 36 37 private static int get() { 38 readLock.lock(); 39 try { 40 return count; 41 } finally { 42 readLock.unlock(); 43 } 44 } 45 46 private static void add() { 47 writeLock.lock(); 48 try { 49 count++; 50 } finally { 51 writeLock.unlock(); 52 } 53 } 54 55}

原文链接
 


点赞
收藏

评论区

加载中...

相关推荐

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java中的锁

记录一下公平锁,非公平锁,可重入锁(递归锁),读写锁,自旋锁的概念,以及一些和锁有关的java类。公平锁与非公平锁:公平锁就是在多线程环境下,每个线程在获取锁时,先查看这个锁维护的队列,如果队列为空或者自身就是等待队列的第一个,就占有锁。否则就加入到等待队列中,按照FIFO的顺序依次占有锁。非公平锁会一上来就试图占

Java并发系列4

今天讲另一个并发工具,叫读写锁。读写锁是一种分离锁,是锁应用中的一种优化手段。考虑读多写少的情况,这时如果我们用synchronized或ReentrantLock直接修饰读/写方法未尝不可,如:publicstaticclassRw{privateintval;publicsynchr

JAVA中 ReentrantReadWriteLock读写锁详系教程,包会

一、读写锁简介现实中有这样一种场景:对共享资源有读和写的操作,且写操作没有读操作那么频繁。在没有写操作的时候,多个线程同时读一个资源没有任何问题,所以应该允许多个线程同时读取共享资源;但是如果一个线程想去写这些共享资源,就不应该允许其他线程对该资源进行读和写的操作了。 针对这种场景,JAVA的并发包提供了读写锁ReentrantReadW

MySQL锁

<br1\.表锁表锁分为写锁,读锁,二者读读不阻塞,读写阻塞,写写阻塞<br<br2\.行锁行锁分为共享锁,排他锁,即读锁和写锁多粒度锁机制自动实现表、行锁共存,InnoDB内部有意向表锁意向共享锁(IS):事务在给一个数据行加共享锁前必须先取得该表的IS锁。

ReentrantReadWriteLock(读写锁)

ReentrantReadWriteLock是JDK5中提供的读写分离锁。读写分离锁可以有效的帮助减少锁的竞争,以此来提升系统的性能。用锁分离的机制来提升性能也非常好理解,比如线程A,B,C进行写操作,D,E,F进行读操作,如果使用ReentrantLock或者synchronized关键字,这些线程都是串行执行的,即每次都只有一个线程做操作。但是当D进行读