先来比较一下Lock的四个锁方法:
1.void lock()
在等待获取锁的过程中休眠,禁止一切线程调度
2.void lockInterruptibly() throws InterruptedException
在等待获取锁的过程中可以被中断,被中断后抛出异常
3.boolean tryLock()
获取到锁返回true,获取不到锁返回false,不会等待
4.boolean tryLock(long time, TimeUnit unit) throws InterruptedException
在指定时间内获取锁,在等待过程中可被中断,被中断后抛出异常,获取到锁返回true,指定时间到后返回false
第一种方法,线程在等待锁的期间禁止一切线程调度,所以即使被中断,它也要等到获得锁以后才能进行下一步操作,否则会一直处在阻塞状态,这样就容易引起死锁。所以引入了其他三种方法,可以避免死锁或允许打破死锁。
在等待条件时,也可以使用超时方法,myCondition.await(long time, TimeUnit unit) throws InterruptedException