Java可重入读写锁实现:ReentrantReadWriteLock
报价宝综合消息Java可重入读写锁实现:ReentrantReadWriteLock
概述
ReentrantReadWriteLock包含读写两把锁,如下:// 写锁
public ReentrantReadWriteLock.WriteLock writeLock() { return writerLock; }
// 读锁
public ReentrantReadWriteLock.ReadLock readLock() { return readerLock; }
对同一执行绪而言,读,写读(先写后读),写写是共享的,读写(先读后写)是互斥的;对不同执行绪而言,读是共享的,读写,写读,写写是互斥的。读写锁
写锁的请求:(1)当前没有执行绪在执行读写,则可以进行写操作;
(2)当前存线上程在进行写操作,当前请求写操作的执行绪就是当前正在进行写操作的执行绪时,才能继续发起写请求;如果当前是其他执行绪在写,则当前执行绪无法请求写;
(3)当前不存在写,但是存线上程在读,则无法请求写。

读锁的请求:当前不存在写的执行绪,或者当前正在写的执行绪就是当前请求读的执行绪,则可以成功请求读;如果当前存在其他执行绪在写,则无法请求读。

总结
对于写的请求,要么当前不存线上程在进行读写,要么是该请求写的执行绪在写,则可以成功获取写锁进行写操作,即写对同一执行绪是可重入的。如果当前存在其他执行绪在写,或者存线上程(当前或者其他执行绪)在读,则无法获取写锁进行写操作。即读写是互斥的,同一执行绪的写是可以共享的,可重入的。对于读的请求,如果当前不存线上程在写,或者当前在写的执行绪就是该请求读的执行绪自身,则可以成功获取读锁进行读操作;如果当前存在其他执行绪在写,则无法成功执行读请求。