ReentrantLock介绍
ReentrantLock是一个可重入的互斥锁,与使用synchronized方法和语句访问的隐式监视锁具有相同的基本行为和语义,但具有扩展功能。ReentrantLock属于最后一个成功加锁并且还没有释放锁的线程。当一个线程请求lock时,如果锁不属于任何线程,将立马得到这个锁;如果锁已经被当前线程拥有,当前线程会立即返回。
下面这个图是与ReentrantLock相关的UML类图,可以看到ReentrantLock实现了Lock和Serializable接口,表示它实现了lock()、unlock()等Lock的接口方法,并且是一个可以序列化的类。ReentrantLock主要成员变量为Sync,Sync是一个抽象类,继承了AbstractQueuedSynchronizer(简称AQS),AQS提供了一个基于FIFO队列,可以用于构建锁或者其他相关同步装置的基础框架,本文不详细介绍。而Sync有两个实现类:NonfairSync和FairSync,分别代表非公平锁和公平锁。也就是说ReentrantLock中所有的锁操作都是由sync这个成员变量完成的。
ReentrantLock构造方法
下面的代码为它的构造函数,可以看到无参构造函数直接返回非公平锁。
ReentrantLock加锁方法
下面是三个常用的ReentrantLock加锁方法,分别为lock、tryLock、lockInterruptibly。
上面代码的注释已经很明白,这里我总结一下:
lock:拿不到lock就不会结束,不然线程就一直等待
tryLock:马上返回,拿到lock返回true,否则返回false
lockInterruptibly:线程在请求lock并被阻塞时,如果被中断,则此线程会被唤醒并被要求处理InterruptedException。并且如果线程已经被interrupt,再使用lockInterruptibly的时候,此线程也会被要求处理interruptedException
ReentrantLock释放锁方法
ReentrantLock的释放锁方法比较简单,只有一个unlock。下面是它的说明。
ReentrantLock其他方法
下面列出了ReentrantLock的其他方法都比较好理解。
总结一下
本文仅仅是对ReentrantLock做了简单的介绍,包括主要结构和主要方法。通过上面的描述可以看到,ReentrantLock所有的方法都交给了它的sync成员变量来完成。接下来将会对公平锁和非公平锁进行分析。