ReentrantLock是Java中的一个可重入锁,也被称为“独占锁”。它基于AQS(AbstractQueuedSynchronizer)框架实现,是JDK中提供的一种线程并发访问的同步手段,与synchronized类似,但具有更多特性。
ReentrantLock的主要特性包括:
-
可重入性:ReentrantLock可以被同一个线程多次获取,而不会出现死锁的情况。这是因为在内部实现中,ReentrantLock会记录当前持有锁的线程以及锁的重入次数,只有当锁的持有线程和重入次数匹配时,才会释放锁。
-
支持公平锁和非公平锁:公平锁是指多个线程按照申请锁的顺序来获取锁,而非公平锁则允许线程“插队”获取锁。在ReentrantLock中,可以通过构造函数来设置锁的公平性。默认情况下,ReentrantLock使用的是非公平锁,这可以提高程序的性能,但在某些情况下可能会导致线程“饥饿”问题。
-
支持中断:ReentrantLock提供了可以响应中断的锁获取方法,如lockInterruptibly()。当线程在等待获取锁的过程中被中断,该方法会抛出InterruptedException异常,从而允许线程响应中断。
-
支持条件变量:ReentrantLock还提供了条件变量(Condition)的功能,允许线程在等待某个条件满足时释放锁并进入等待状态。当条件满足时,线程可以被唤醒并重新获取锁。这与Object类中的wait()和notify()方法类似,但ReentrantLock的条件变量提供了更灵活和强大的功能。
总的来说,ReentrantLock是一个功能强大且灵活的锁机制,适用于需要高并发访问和同步的场景。然而,使用ReentrantLock时也需要注意避免死锁和线程饥饿等问题。