ReadWriteLock的实现原理

ReadWriteLock成为读写锁,事java并发包下的一个类,该锁包括读锁和写锁。其中读锁之间采用共享式获取锁资源,读线程之间互不影响;如果有线程获取了读锁,那么写锁则会获取失败;如果有线程获取了写锁,则读锁获取失败(非同一线程),写锁是可重入锁,也是独占锁。读写锁的共享资源是4个字节的int类型,高16位表示读锁数;低16位表示写锁次数。
00000000 00000000 00000000 00000000
c:=0 读写锁都没有 w:=0 读锁没有 r:=写锁没有
00000000 00000001 00000000 00000000
c:!=0 读锁为1 写锁没有
00000000 00000000 00000000 00000001
c:!=0 写锁不为0

读写锁不支持锁升级,像:

r.lock()
// do something
w.lock()
// do ...
w.unlock()
// ...
r.unlock()

比如:线程1获取了读锁,当执行到要获取写锁的代码时,线程2获取了读锁,此时线程1想获取写锁就会失败;同样线程2继续执行,想获取写锁的时候,线程1因为获取了读锁,线程2获取写锁失败,则等待。

读写锁支持锁降级,像

w.lock()
// do ...
r.lock()
// do ...
r.unlock()
// do ...
w.unlock()
// do ...

线程1获取了写锁,在要获取读锁之前,线程2尝试获取写锁失败,等线程1获取了读锁,执行完释放读锁,再释放写锁,线程2就可以获取锁资源了,这样线程1的修改内容对线程2是可见的,避免了脏读出现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,非常感谢您的提问。Java AQS是一种基于的同步类,用来在多线程环境下保证数据的正确性和一致性。AQS全称是AbstractQueuedSynchronizer,是一个抽象类。下面我会为你详细介绍AQS的原理。 AQS的核心思想是"共享机制"和"排队等待机制"。共享机制是指多个线程可以同时获取一个资源的读,而只有一个线程可以获取该资源的写;排队等待机制是指在获取时,如果已经被其他线程获取,就需要进入队列等待,一旦可用,就会通知队列中的下一个线程。 AQS通过实现模板模式和回调机制来实现子类对于获取和释放的控制,其中lock()方法和unlock()方法的实现是由子类来提供的。AQS提供了一个双向链表,用于存储等待线程的信息,并使用CAS来更新队列头、尾指针。在获取时,线程会被加入等待队列,并在队列中等待被唤醒。 下面我们通过一个示例来说明AQS的实际应用。假设我们有一个共享资源counter,多个线程需要对其进行修改。我们可以使用AQS提供的ReentrantReadWriteLock来实现读写的功能。 ```java import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; public class Counter { private int value = 0; private final ReadWriteLock lock = new ReentrantReadWriteLock(); public int getValue() { // 读 lock.readLock().lock(); try { return value; } finally { lock.readLock().unlock(); } } public void increment() { // 写 lock.writeLock().lock(); try { value++; } finally { lock.writeLock().unlock(); } } } ``` 在例子中,我们创建了一个Counter类来表示一个计数器,其中使用了ReadWriteLock类来实现读写的功能。getValue()方法通过获取读来读取value变量的值,increment()方法通过获取写来修改value变量的值。在这里需要注意,我们使用了try-finally块来确保的释放,从而避免泄露的问题。 以上就是AQS的一些原理和应用。希望能够对您有所帮助,如果您有其他问题可以随时提出,我会尽力为您解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值