Java 并发问题的处理神器:ReentrantReadWriteLock

本文详细介绍了Java中ReentrantReadWriteLock类的使用方法及其优势。通过对比synchronized关键字,解释了读写锁如何提高多线程环境下的效率。同时提供了具体的代码示例帮助理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java的内存模型有一个原则:线程中变量的修改可能不会立即对其他线程可见。

 

如果是原子操作可以添加volatile关键字,也可以使用Atomic*这组类,但不太方便所以也很少被使用。

我们常用synchronized来解决并发问题,虽然写起来非常方便,但synchronized是不区分读与写都会强制“同步”。

ReentrantReadWriteLock 类就解决了synchronized 的读写区分问题。

我们知道,线程如果当前在做写操作,就应该对变量加一把写锁。此时不允许其他线程读与写。

线程如果当前在做读操作,就应该对变量加一把读锁。此时不允许其他线程写,但是可以允许读。

ReentrantReadWriteLock就是基于此实现的。

 

private MyClass myClass;  //锁的资源  
private final ReadWriteLock lock = new ReentrantReadWriteLock();  
private final Lock r = lock.readLock();  
private final Lock w = lock.writeLock();  

r.lock();  
try {  
    result = myClass.getSomething();  
} catch (Exception e) {  
} finally {  //一定用finally
    r.unlock();  
}  

w.lock();  
try{  
     result = myClass.setSomething("123");  
}finally{  
    w.unlock();  
}  

 

这样逻辑既简单明了,又写起来方便。

 

转载于:https://www.cnblogs.com/kinzhang/p/3173433.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值