Lock提供了一种无条件的,可轮询的,定时的,可中断的锁获取操作
轮询锁与定时锁
如果不能同时获取所需要的所有的锁,那么就可以使用可定时的或可轮询的锁获取方式来保证安全性。
如果得不到所有的锁,那么释放已经获得的所有的锁,并尝试重新获取锁。
long endTime=now()+duration;Lock lock;while(true){if(lock.lockA.tryLock){try{// 如果请求不到所有的锁,释放已经有的锁if(lock.lockB.tryLock){try{// dosomething();// return;}finally{lock.lockB.unlock();}}}finally{lock.lockA.tryLock}}if(endTime < now()) { // 指定了时间的限制return false;}// 睡一下,重新尝试获取锁Thread.sleep(xxx);}
可中断的锁
使用Lock的**void **``lockInterruptibly() ``**throws **``InterruptedException;方法,
可以在获得锁的同时保持对中断的响应,被中断则抛出InterruptedException异常
func() throw InterruptedException{lock.lockInterruptibly();try{dosomething()}finally{lock.unlock();}}
所有加锁、解锁都是显式的
- 必须在finally中
lock.unlock() 
使用它的理由:
- 可以中断一个正在等待获取锁的线程
 - 取消一个等待锁时间过长的线程
 - 可以提供更灵活的加锁机制
 
