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 实现了读写锁的机制。
读写锁的区别:
- 读锁(共享锁)可以被多个线程持有,适用于读操作频繁的情况。
- 写锁(排他锁)只能被一个线程持有,适用于写操作频繁的情况。
读写锁的锁降级:
锁降级是指将写锁降级为读锁的过程。在使用读写锁时,如果一个线程持有写锁,然后获取读锁,并且在释放写锁之前先释放读锁,那么就实现了锁降级。这样可以保证在修改数据后,仍然能让其他线程读取数据,提高了并发性。