Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

Lock是JUC包中的一个接口,是在synchronized关键字之后出现的,用来提供锁的功能,本文主要讨论Lock接口以及其实现类,以及为什么有了synchronized关键字了还要有Lock.

synchronized作为内嵌的Java关键字,其可以隐式地获取和释放锁,它简化了同步的管理,同时也固化了锁的获取和释放,缺少灵活性。

在Java SE 5 之后,新增了Lock接口(以及相关实现类),相比于Synchronized关键字,它需要显式的获取和释放锁,同时增加了超时获取、响应中断等方法。

先来看下它的实现关系

du6e6H.png

我们会主要讨论圈出来的三个实现类

再来看下Lock接口的成员

du6M7t.png

其中lock(),tryLock(),tryLock(ong, TimeUnit)以及lockInterruptibly()用来加锁,unlock()用来解锁。需要注意的是如果使用lockInterruptibly()方法来获取锁的话,如果线程没有获取成功而进入等待队列,那么这个线程是可以响应中断的,相比只下,使用synchronized关键字获取锁时如果进入等待队列,线程是不能响应中断的。

Lock接口只是定义了实现锁的一系列约定,比如lock(),unLock()以及tryLock()等,具体的实现都是交给它的实现类去做的,比如ReentrantLock,ReentrantReadWriteLock.ReadLockReentrantReadWriteLock.WriteLock等。而这些实现类能够实现锁功能的关键,在于它们都聚合了一个AQS的实现类,AQS是一个抽象类,通过模板方法模式,提供了一系列状态同步的方法。

评论