java - Java同步:如何让等待线程不执行同步任务
问题描述
假设我有一段想要同步执行的 Java 代码,但是当拥有锁的线程释放该锁时,我不希望等待线程再执行同步代码。我只是希望他们等到同步代码完成运行。
因此,当线程 1 进入同步代码(方法、代码块)时,它必须锁定该代码。任何后续线程都必须等待第一个线程完成运行代码。至此,定期进行代码同步。
但是在我的情况下,当第一个线程完成并释放锁时,我希望等待线程跳过该同步代码(代码更新所有线程使用的资源)。
我将如何使用同步功能在 Java 中创建它?目前我没有使用同步功能,而是使用持有锁(上下文)的并发集合,如下所示。但是,锁定过程仍然需要以某种方式同步,因为两个线程能够获得上下文的锁定。
干杯!
凯尔德
/*
* A concurrently accessible set of contexts.
*/
private static final Set<String> LOCKED_CONTEXTS;
static {
LOCKED_CONTEXTS = ConcurrentHashMap.newKeySet(); // meanwhile, I replaced this with Collections.synchronizedSet(new HashSet<>())
}
...
if (!LOCKED_CONTEXTS.contains(context)) {
LOCKED_CONTEXTS.add(context);
log.debug("Locked context: {}", context);
try {
doTask();
} finally {
LOCKED_CONTEXTS.remove(context);
log.debug("Released context: {}", context);
}
} else {
log.debug("Waiting for context to be released: {}", context);
while (LOCKED_CONTEXTS.contains(context)) {
}
log.debug("The waiting is over, context is released: {}", context);
}
解决方案
我认为您想将锁与信号量结合使用。
tryLock
在锁上- 如果你得到它,做工作。在工作结束时,将信号量标记为完成
- 如果你没有得到它,等待信号量完成
推荐阅读
- javascript - 动画不改变位置
- json - Jersey Jackson JSON attribute change globally
- java - 如何将我的表值从 html 获取到 servlet?
- phpunit - Behat:期望发送电子邮件
- reactjs - 打字稿编译错误尝试使用material-ui withStyles
- amazon-cognito - 我们可以触发一个 lambda 函数来从 cognio 读取用户登录、注销、密码更改、用户详细信息事件吗
- html - 在多个背景图像中垂直缩放图像
- java - 在同一场景的另一个 JavaFX 控制器中进行更改
- kubernetes - JHipster 在 Kubernetes 上启动
- javascript - 如何使用参考 $jumbotron 更改 jumbotron 中单词的颜色?