1、从JAVA5.0开始,提供了新的选择:ReentrantLock。
2、可定时和可轮询的锁获取模式由tryLock方法实现。
3、使用tryLock试图获得的锁如果不能同时获得,就回退,并重新尝试。休眠时间由一个特定组件管理。(下面的代码完成转帐)
public boolean transferMoney(Account fromAcct,AccounttoAcct,DollarAmonunt amount,long timeout,TimeUnit unit)
throwsInsufficientFundsException,InterruptedException{
longfixedDelay=getFixedDelayComponentNanos(timeout,unit);
longrandMod=getRandomDelayModulusNanos(timeout,unit);
longstopTime=System.nanoTime()+unit.toNanos(timeout);
while (true){
if (fromAcct.lock.tryLock()){
try{
if(toAcct.lock.tryLock()){
try {
if (fromAcct.getBalance().compareTo(amount)<0)
thrownew InsufficientFundsException();
else {
fromAcct.debit(amount);
toAcct.credit(amount);
returntrue;
}
}finally{toAcct.lock.unlock();}
}
}finally{fromAcct.lock.unlock();}
}
}
if(System.nanoTime()<stopTime) return false;
NANOSECONDS.sleep(fixedDelay+rnd.nextLong()%randMod);
}
4、具有时间限制的活动,定时锁同样有用.超时后程序提前返回.
public boolean trySendOnSharedLine(String message,longtimeout,TimeUnit unit)
throwsInterruptedException{
longnanosToLock=unit.toNanos(timeout)-estimatedNanosToSend(message);
if (!lock.tryLock(nanosToLock,NANOSECONDS)) return false;
try{
return sendOnSharedLine(message);
}finally{lock.unlock();}
}
5、一个可中断的锁可以响应中断,能取消。
public boolean sendOnSharedLine(Stringmessage)
throws InterruptedException{
lock.lockInterruptibly();
try{
return cancellableSendOnSharedLine(message);
}finally{
lock.unlock();
}
}
private boolean cancellableSendOnSharedLine(String message)
throwsInterruptedException{...}
}
转http://deepfuture.iteye.com/blog/599557
相关推荐
- `ReentrantLock`是Java 1.5之后引入的一个可中断、可轮询、可定时的锁。 - 示例代码: ```java private ReentrantLock lock = new ReentrantLock(); private Condition c1 = lock.newCondition(); private ...
使用`tryLock()`方法可以实现一种称为“可轮询”的锁请求模式。这种模式下,如果锁不可用,则线程不会被挂起,而是立即返回一个布尔值表示是否成功获取锁。如果锁未获取成功,则可以根据业务逻辑决定是否再次尝试...
- **可轮询和定时锁**: `tryLock()`方法使得线程在无法获取锁时可以选择立即返回,而不是一直阻塞,从而避免死锁。`tryLock(long time, TimeUnit unit)`允许设置超时时间,超时未获取到锁也会返回。 - **公平性**: ...
- `ReentrantLock`需要显式地调用`lock()`和`unlock()`方法来获取和释放锁,且建议使用`try-finally`结构确保锁的释放,以防止异常导致的锁未释放问题。 总的来说,如果`synchronized`能满足需求,应优先使用,...
* 实现可轮询的锁请求:通过tryLock()方法实现,仅在调用时锁为空闲状态才获取该锁。 * 实现可定时的锁请求:通过tryLock(long, TimeUnit)方法实现,在时间预算内设定相应的超时。 * 实现可中断的锁获取请求:通过...