Lock接口是锁的实现,用来控制多个线程访问共享资源的方式,是在java 1.5的时候引入的,在此之前,只能通过synchronized的方式来取得对象的锁。
synchronized中的锁是隐式获取释放的,而Lock中的锁需要显示的获取和释放,同时提供了可中断,超时获取等Synchronized不具备的特性。
由于Synchronized中的是隐式的获取和释放锁,所以只能是先获取一个锁,然后释放该锁,但是在Lock的时候,却可以先获取一个锁,再获取另外一个锁,
然后在释放掉前一个锁。
同时,在Lock中还提供了一种条件锁的方式,通过newCondition()来获取一个条件锁。
提供的主要方法:
void lock():获取锁,调用该方法当前线程将会获取锁,当锁获得后,从该方法返回。
void lockInterruptibly() throws InterruptedException:可中断地获取锁,和lock()方法的不同之处在于该方法会响应中断,即在锁的获取中可以中断当前线程
boolean tryLock() :尝试非阻塞的获取锁,调用该方法后立刻返回,如果能够获取则返回true,否则返回false
boolean tryLock(Long time,TimeUnit unit) throws InterruptedException:超时的获取锁,只有在当前线程获得了锁、被中断、超时才会返回
void unlock():释放锁。
Condition newCondition():获取条件锁(等待通知组件),该组件和当前的锁绑定,当前线程只有获得了锁,才能调用该组件的wait()方法,而调用后,当前线程将释放锁。
使用方式:
Lock l = ...; l.lock(); try { // access the resource protected by this lock } finally { l.unlock(); }