【发布时间】:2021-01-02 04:06:25
【问题描述】:
假设我有一段 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);
}
【问题讨论】:
-
同时,通过用同步集替换并发集,我得到了上述解决方法来做我想做的事。但是解决方法对我来说并不理想。现在正在研究 Semaphore 建议...
-
同步在一个对象上,用于杂项代码。这里似乎关注一段代码,一个关键区域?通常人们会在同步一条 if 语句之后看到,反映第一次演练的条件已经产生了一个东西。
标签: java synchronization