前面我们一直提到的,同步代码(synchronized方法,synchronized变量)依赖于可重入锁,这种锁很容易使用,但是有很多局限性。更复杂的锁在Java.util.concurrent.locks包中,我们今天只简单聊聊Lock对象。
Lock对象工作方式很想我们前面提到的同步锁,我们将前面介绍过的锁称作隐示锁。和隐示锁一样,Lock对象一次也只能只能有一个对象拥有该锁。Lock对象也可以通过Condition类同样支持wait/notify的机制
Lock对象与隐示锁相比,最大的优势在于,不仅具备隐示锁的能力,还具备:如果获取锁失败,可以在直接返回,或者在指定时间内失败后返回(tryLock方法)。而隐示锁只能够做到当不能获取到锁的时候,让线程阻塞在那里。另外一个方法lockInterruptibly可以做到当其他线程发来中断事件过来,而当前线程没有获得对象的锁的时候,可以直接返回。由于使用隐示锁的同步方法不一定能马上获取到对象锁而处于阻塞状态,这点正是我们之前说过的,可以将时间处理较长的任务设计成相应中断的。lockInterruptibly正符合这种情况。