Read/Write locks in java(java中的读写锁)

本篇文章主要介绍读写锁的一些原理及实现。翻译原文地址

Java中的读写锁

假设一个java应用程序需要读以及写一些资源,但是写的频率要远远低于读。多个读线程读取资源不会有什么问题。但是如果一个线程想要写资源,那么同时就不能有其他线程读或写这个资源。为了能够允许多个读线程和一个写线程,我们需要读写锁。
虽然Java中提供了读写锁的实现,但是我们还是要知道读写锁背后的原理,这样才能在实际使用中处理具体的问题。

Java中实现读写锁

总结一下对于获取资源的读权限和写权限可以如下:
读权限:当没有其他线程写当前资源或者没有其他线程请求当前资源的写权限,那么当前线程就能够获取资源的读权限
写权限:如果没有其他线程读或者写当前资源,当前线程就能获取资源的写权限
只要没有其他线程正在写资源或者没有其他线程请求写资源,那么当前线程就能够读取资源。如果读线程发生的很多,但是又没有提升写线程的优先级,那么就可能发生”饥饿”现象。

可重入读写锁

可重入读锁

可重入写锁

读锁升级到写锁

写锁降级到读锁

可重入读写锁的完整实现

在finally中调用unlock