版权声明:本文为博主原创文章,转载请注明出处:http://blog.jerkybible.com/2017/09/29/Java并发源码之ReentrantLock-一/
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
成员变量来完成。接下来将会对公平锁和非公平锁进行分析。