Java ReentrantReadWriteLock如何实现读写锁的并发控制原理?
- 内容介绍
- 文章标签
- 相关推荐
本文共计5448个文字,预计阅读时间需要22分钟。
一、读写锁+有这种场景:
1、如果对一个共享资源的读写操作没有频繁,这时候可以允许多个线程同时读取;
2、但是如果有线程想要写这些共享资源,则需要先获取写锁。
一、读写锁
有这样一种场景:
- 1、如果对一个共享资源的写操作没有读操作那么频繁,这个时候可以允许多个线程同时读取共享资源;
- 2、但是如果有一个线程想去写这些共享资源,那么其他线程此刻就不应该对这些资源进行读和写操作了。
Java中的ReentrantReadWriteLock正是为这种场景提供的锁。该类里面包括了读锁和写锁。
1.1、可获取读锁的情况
- 没有其他线程正在持有写锁;
- 尝试获取读锁的线程同时持有写锁。
1.2、可获取写锁的情况
- 没有其他线程正在持有读锁;
- 没有其他线程正在持有写锁。
1.3、读写锁特点
- 允许并发读:只要没有线程正在更新数据,那么多个线程就可以同时读取数据;
- 只能独占写:只要有一个线程正在写数据,那么就会导致其他线程的读或者写均被阻塞;但写的线程可以获取读锁,并通过释放写锁,让锁降级为读锁;(不能由读锁升级为写锁)
- 只要有一个线程正在读数据,那么其他线程的写入就会阻塞,直到读锁被释放;
- 公平性:支持非公平锁和公平锁,非公平锁吞吐量较高;
- 可重入:无论是读锁还是写锁都是支持可重入的。
读写锁可以增加更新不频繁而读取频繁的共享数据结构的吞吐量。
本文共计5448个文字,预计阅读时间需要22分钟。
一、读写锁+有这种场景:
1、如果对一个共享资源的读写操作没有频繁,这时候可以允许多个线程同时读取;
2、但是如果有线程想要写这些共享资源,则需要先获取写锁。
一、读写锁
有这样一种场景:
- 1、如果对一个共享资源的写操作没有读操作那么频繁,这个时候可以允许多个线程同时读取共享资源;
- 2、但是如果有一个线程想去写这些共享资源,那么其他线程此刻就不应该对这些资源进行读和写操作了。
Java中的ReentrantReadWriteLock正是为这种场景提供的锁。该类里面包括了读锁和写锁。
1.1、可获取读锁的情况
- 没有其他线程正在持有写锁;
- 尝试获取读锁的线程同时持有写锁。
1.2、可获取写锁的情况
- 没有其他线程正在持有读锁;
- 没有其他线程正在持有写锁。
1.3、读写锁特点
- 允许并发读:只要没有线程正在更新数据,那么多个线程就可以同时读取数据;
- 只能独占写:只要有一个线程正在写数据,那么就会导致其他线程的读或者写均被阻塞;但写的线程可以获取读锁,并通过释放写锁,让锁降级为读锁;(不能由读锁升级为写锁)
- 只要有一个线程正在读数据,那么其他线程的写入就会阻塞,直到读锁被释放;
- 公平性:支持非公平锁和公平锁,非公平锁吞吐量较高;
- 可重入:无论是读锁还是写锁都是支持可重入的。
读写锁可以增加更新不频繁而读取频繁的共享数据结构的吞吐量。

