Skip to content

Lock锁

ReentrantLock

ReentrantLock 是Java并发包 (java.util.concurrent.locks) 中的一种可重入锁。它是独占锁的一种,也被称为互斥锁。ReentrantLock 提供了更灵活的锁定机制,相比于 synchronized 关键字,具有以下特点:

特性:

  1. 可重入性:一个线程在获取锁之后,可以多次获取该锁而不会被阻塞。例如,假设线程A已经持有了 ReentrantLock,线程A再次请求这个锁时,不会被阻塞,它可以直接获得锁。这是通过维护一个锁计数器实现的,每次获取锁计数器加1,每次释放锁计数器减1,当计数器为0时锁被真正释放。

  2. 可中断性:ReentrantLock 提供了一个可中断的锁获取操作。如果一个线程在等待获取锁的过程中被中断,能够响应中断信号并退出等待状态。这是通过 lockInterruptibly() 方法实现的。

  3. 定时锁获取:ReentrantLock 允许在尝试获取锁时设置超时时间,如果在指定的时间内未能获取锁,可以退出等待状态。这是通过 tryLock(long timeout, TimeUnit unit) 方法实现的。

  4. 公平锁和非公平锁:ReentrantLock 支持公平锁和非公平锁。公平锁按照先到先得的顺序获取锁,非公平锁则是允许插队,提高并发性能。默认情况下,ReentrantLock 是非公平锁,可以通过构造函数指定公平性。

注意:ReentrantLock 非公平锁会通过两次CAS去抢锁,如果失败则将当前线程加入到同步队列中等待唤醒。