可重入锁
Java中的可重入锁(ReentrantLock)是用于控制并发的一种工具,它的功能类似于Java内置的Synchronized语法。可重入锁是指一个线程可以多次对某个锁进行加锁操作,比如程序在多层调用中多次使用锁。而对于不可重入锁来说,进行两次以及上的加锁会导致死锁的产生。
ReentrantLock是一种独占锁,在独占模式下线程只能逐一使用锁,即任意时刻仅仅只能有一条线程持有锁。如下图,线程一首先成功调用lock方法进行加锁操作从而持有该锁,其它两个线程只能等待线程一释放锁。因为锁是可重入的,所以线程一可多次调用lock方法对锁进行加锁操作。当线程一调用unlock方法释放锁后,线程二调用lock方法成功获得锁。接着线程二也调用unlock方法释放锁,然后线程三调用lock方法成功获得锁,并且其也可以多次调用lock方法对该锁进行加锁操作。
四要素
ReentrantLock类的四要素为:公平/非公平模式、lock方法、unlock方法以及newCondition方法。公平/非公平模式表示多个线程同时去获取锁时是否按照先到先得的顺序获得锁,如果是则为公平模式,否则为非公平模式。lock方法用于获取锁,假如锁已被其它线程占有则进入等待状态。unlock方法用于释放锁。newCondition方法用于返回一个新创建的Condition对象,这个对象支持线程的阻塞和唤醒功能,每个Condition对象内部都有一个等待队列