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()
使用它的理由:
- 可以中断一个正在等待获取锁的线程
- 取消一个等待锁时间过长的线程
- 可以提供更灵活的加锁机制