java - 阻塞其他线程直到一个线程完成的最佳方法
问题描述
我有很多线程可以监视某个状态。如果应用程序进入该状态,那么我需要做一些额外的工作。我想只允许 1 个线程执行它,并希望阻止其他线程,直到该工作完成。阻塞意味着他们不能再次执行该任务。
我有以下情况:
ReentrantLock lock = new ReentrantLock
void doSomething() {
if (lock.tryLock()) {
try {
doSomeWork()
} finally {
lock.unLock()
}
} else {
// wait for DoSomeWork is done
}
}
我可以循环监视lock.isLocked()
,但实际上我只想等待,直到另一个线程完成工作。
解决方案
根据有关ReentrantLock类的文档:
推荐的做法是总是在调用 lock 之后立即使用 try 块,最常见的是在构造之前/之后,例如:
class X {
private final ReentrantLock lock = new ReentrantLock();
// ...
public void m() {
lock.lock(); // block until condition holds
try {
// ... method body
} finally {
lock.unlock()
}
}
}
从lock()方法的文档中:“如果锁被另一个线程持有,那么当前线程将被禁用以用于线程调度目的并处于休眠状态,直到获得锁”,这就是您希望在您的场景中得到保证的内容.
推荐阅读
- c++ - 在类模板中使用 typedef 时出错
- java - 如何使用 Spring LDAP 模板连接到 AWS Simple AD LDAP
- docker - 在创建容器时可以指定一个命名的 docker 卷来挂载吗?在 Json API 中
- javascript - 获取移动元素的当前位置 - 鼠标点击
- php - 在laravel中创建新数据时无法按类别保存计算数据
- javascript - 如果名称更改,Javascript 返回 NaN
- java - 如果 a 将对象 A 转换为对象 B,B 是否保留 A 的 ArrayList?
- sql-server - 根据参数从数据库中检索数据
- cassandra - cassandra:它是否自动建立索引,每行列数非常多(宽列)?
- java - 在使用 GSON 反序列化 JSON 的对象类中制作字段/构造函数 PRIVATE 或 PUBLIC 或 NEITHER?