Java中的ReentrantReadWriteLock使用详解
ReentrantReadWriteLock
ReadWriteLock即读写锁,ReadWriteLock的规则如下。
a.当有线程获取了Write锁时,其他线程不能获取到任何锁(写锁和读锁都不能。
b.当没有线程获取Wrete锁时,所有线程都可以获取Read锁。
c.当有Read锁存在时,获取不到Write锁。
1 ReentrantReadWriteLock实现类继承关系

可见该类实现了ReadWriteLock接口。
2 ReentrantReadWriteLock使用
创建一个读写锁。
static ReadWriteLock lock = new ReentrantReadWriteLock();
获取写锁。
lock.writeLock().lock();
释放写锁。
lock.writeLock().unlock();
获取读锁。
lock.readLock().lock();
释放读锁。
lock.readLock().unlock();
3 ReentrantReadWriteLock使用实例
该实例测试的是上边的规则c——当有Read锁存在时,获取不到Write锁。
让一个线程先获取到读锁并持有5秒钟。
这是其他线程尝试去获取写锁,发现5秒之后其他线程再开始写入然后在控制台打印出结果。
class ReadWriteLockDemo{
static ReadWriteLock lock = new ReentrantReadWriteLock();
static String text = "hello";
public static void modify(){
lock.writeLock().lock();
try {
System.err.println(Thread.currentThread().getName()+"开始修改");
text += " "+Thread.currentThread().getName();
}catch (Exception e){
e.printStackTrace();
}
finally {
lock.writeLock().unlock();
}
}
public static void readWithReadLock(){
lock.readLock().lock();
try {
System.err.println(text);
Thread.sleep(5000);
System.err.println("5秒过去了");
}catch (Exception e){
}finally {
lock.readLock().unlock();
}
}
public static void main(String[] args) throws InterruptedException {
new Thread(()->{
readWithReadLock();
}).start();
Thread.sleep(1000);
for (int i=0;i<10;i++) {
new Thread(() -> {
modify();
}).start();
}
}
}
使用读写锁时需要需要明确上述三条规则。
并且可知,当读很多时,很难写入,所以读写锁不适用于读和写都很多的情况。
到此这篇关于Java中的ReentrantReadWriteLock使用详解的文章就介绍到这了,更多相关ReentrantReadWriteLock使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
SpringBoot feign动态设置数据源(https请求)
这篇文章主要介绍了SpringBoot如何在运行时feign动态添加数据源,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下2021-08-08
Spring Boot集成LangChain来实现Rag应用的问题小结
检索增强生成(RAG)是一种优化大型语言模型(LLM)输出的技术,通过引用权威知识库以增强模型的准确性和相关性,RAG允许LLM在不重新训练的情况下访问特定领域的知识,提高了其在各种应用中的实用性和信任度,感兴趣的朋友跟随小编一起看看吧2024-09-09


最新评论