《Java concurrent包源码分析》二、可重入锁

Lock接口:

public interface Lock {
    void lock();
    void lockInterruptibly() throws InterruptedException;
    boolean tryLock();
    boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
    void unlock();
    Condition newCondition();
}

Lock接口是锁操作的基础,后面的所有的锁实现都会实现Lock接口。

  1. 最无赖的做法:lock(), 拿不到锁就等着,知道拿到位置。
  2. 最潇洒的做法:tryLock():boolean, 拿不到锁就返回false,拿到锁就返回true,并持有锁。
  3. 最聪明的做法:tryLock(long time, TimeUnit unit) :boolean, 拿不到锁就等一会,如果还拿不到就返回false,如果拿到了锁就返回true,并持有锁。
  4. 最无赖而且危险的做法:lockInterruptibly(), 在普通lock()时,如果线程被interrupt,其实现成是不理会的,只是通过isInterrupted可以判断外界是否interrupt了。但是在lockInterruptibly中就不是这样的,如果外界interrupt了,则这个线程就会立刻处理,并抛出异常InterruptedException。这一点跟sleep,wait,join很像。

ReentrantLock

ReentrantLock的定义是这样的: ReentrantLock implements Lock, java.io.Serializable。 它实现了Lock接口,是Lock最常用的类。

你可能感兴趣的:(《Java concurrent包源码分析》二、可重入锁)