Java可重入读写锁实现:ReentrantReadWriteLock

概述

  • ReentrantReadWriteLock包含读写两把锁,如下:
// 写锁
public ReentrantReadWriteLock.WriteLock writeLock() { return writerLock; }

// 读锁
public ReentrantReadWriteLock.ReadLock readLock() { return readerLock; }
  • 对同一线程而言,读,写读(先写后读),写写是共享的,读写(先读后写)是互斥的;对不同线程而言,读是共享的,读写,写读,写写是互斥的。

读写锁

  • 写锁的请求:

(1)当前没有线程在执行读写,则可以进行写操作;

(2)当前存在线程在进行写操作,当前请求写操作的线程就是当前正在进行写操作的线程时,才能继续发起写请求;如果当前是其他线程在写,则当前线程无法请求写;

(3)当前不存在写,但是存在线程在读,则无法请求写。

  • 读锁的请求:

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

总结

  • 对于写的请求,要么当前不存在线程在进行读写,要么是该请求写的线程在写,则可以成功获取写锁进行写操作,即写对同一线程是可重入的。如果当前存在其他线程在写,或者存在线程(当前或者其他线程)在读,则无法获取写锁进行写操作。即读写是互斥的,同一线程的写是可以共享的,可重入的。
  • 对于读的请求,如果当前不存在线程在写,或者当前在写的线程就是该请求读的线程自身,则可以成功获取读锁进行读操作;如果当前存在其他线程在写,则无法成功执行读请求。
发表评论
留言与评论(共有 0 条评论)
   
验证码:

相关文章

推荐文章

'); })();