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接口。
- 最无赖的做法:lock(), 拿不到锁就等着,知道拿到位置。
- 最潇洒的做法:tryLock():boolean, 拿不到锁就返回false,拿到锁就返回true,并持有锁。
- 最聪明的做法:tryLock(long time, TimeUnit unit) :boolean, 拿不到锁就等一会,如果还拿不到就返回false,如果拿到了锁就返回true,并持有锁。
- 最无赖而且危险的做法:lockInterruptibly(), 在普通lock()时,如果线程被interrupt,其实现成是不理会的,只是通过isInterrupted可以判断外界是否interrupt了。但是在lockInterruptibly中就不是这样的,如果外界interrupt了,则这个线程就会立刻处理,并抛出异常InterruptedException。这一点跟sleep,wait,join很像。
ReentrantLock
ReentrantLock的定义是这样的: ReentrantLock implements Lock, java.io.Serializable。 它实现了Lock接口,是Lock最常用的类。