reentrantlock底层,AQS,具体的结构,变量赋值过程,线程如何唤醒的,公平锁和非公平,和读写锁的区别,读写锁的锁降级。

reentrantlock底层:

ReentrantLock 是 Java 中用于实现独占锁(排它锁)的一种机制,它使用了 AbstractQueuedSynchronizer(AQS)框架来实现锁的底层操作。

AQS 是一个用于构建锁和同步器的框架,它包含了一个队列用于保存等待获取锁的线程,并且使用一个同步状态来标识锁的状态。ReentrantLock 通过继承并使用 AQS 来实现锁的获取和释放机制。

在 ReentrantLock 中,当一个线程请求锁时,会利用 AQS 的 acquire 方法尝试获取锁,如果获取不到,会将当前线程加入到等待队列中。而当持有锁的线程释放锁时,会利用 AQS 的 release 方法来唤醒等待队列中的线程,并通过队列的算法选择一个合适的线程来获得锁。

AQS 中有两个核心方法,分别是 tryAcquire 和 tryRelease,它们是 ReentrantLock 内部实现锁的关键。当一个线程尝试获取锁时,会调用 tryAcquire 方法来尝试获取锁,如果获取成功,则会返回 true;当线程释放锁时,则调用 tryRelease 方法。同时,AQS 会利用一个内部的 volatile 变量来表示锁的状态,以及一个等待队列来管理等待获取锁的线程。

总的来说,ReentrantLock 的底层机制主要是基于 AQS 提供的并发框架,它通过 acquire、release、tryAcquire、tryRelease 等方法来实现锁的获取和释放,以及对等待队列的管理,保证了线程对锁的安全获取和释放。

ReentrantLock 和 AQS:

ReentrantLock 使用 AQS 框架来实现,AQS 是一个用于构建锁和同步器的框架,它包含了一个队列(用于保存等待获取锁的线程)和一个同步状态(用于标识锁的状态)。

ReentrantLock 变量赋值过程:

当一个线程请求锁时(lock() 方法),会利用 AQS 的 acquire 方法来尝试获取锁,如果获取不到,则会将当前线程加入到等待队列中。

线程如何被唤醒:

当持有锁的线程释放锁时(unlock() 方法),会利用 AQS 的 release 方法来唤醒等待队列中的线程,被唤醒的线程会再次尝试获取锁。

公平锁和非公平锁: ReentrantLock 既可以是公平锁,也可以是非公平锁。公平锁会按照等待队列中的顺序来获取锁,而非公平锁则允许已经持有锁的线程有限期间内优先再次获取锁。

读写锁和锁降级

读写锁是一种特殊的锁,它允许多个线程同时读取共享资源,但只允许一个线程写入共享资源。在 Java 中,ReentrantReadWriteLock 实现了读写锁的机制。

读写锁的区别:

  • 读锁(共享锁)可以被多个线程持有,适用于读操作频繁的情况。
  • 写锁(排他锁)只能被一个线程持有,适用于写操作频繁的情况。

读写锁的锁降级:

锁降级是指将写锁降级为读锁的过程。在使用读写锁时,如果一个线程持有写锁,然后获取读锁,并且在释放写锁之前先释放读锁,那么就实现了锁降级。这样可以保证在修改数据后,仍然能让其他线程读取数据,提高了并发性。

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值