Java中ReentrantLock的tryLock()方法可以用来尝试获取锁,如果锁不可用,它不会一直等待下去,而会立即返回。那么tryLock的实际应用场景是什么呢?
主要有以下两种:
-
在限定时间内完成操作 如果获取锁后有一些耗时操作,可以使用tryLock(long timeout, TimeUnit
unit)在限定时间内去获取锁,如果超时无法获取则执行其他逻辑。 -
优雅关闭正在占用锁的线程
如果有一个工作线程持续占用锁执行操作,在程序关闭时,可以设置一个标志告知其尽快结束,然后循环调用tryLock检查它是否已结束(tryLock返回true表示已结束)。在tryLock失败的else块可以记录关闭延迟的原因,添加短暂sleep避免占用过多CPU。
示例代码:
javaCopy code// 在1秒内尝试获取锁
if(lock.tryLock(1, TimeUnit.SECONDS)){
// 执行业务
} else {
// 获取锁超时
}
// 检测工作线程是否已关闭
done = true;
while(!done){
if(lock.tryLock()){
done = true;
lock.unlock();
} else {
// 记录日志,延迟重试
}
}
所以tryLock的实际场景是:不愿等待锁不定时长释放,或者需要检测锁是否已被释放。合理利用tryLock可以实现更加高效和智能的锁处理。
转载自:AnswerBlog