首页 > 解决方案 > 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);
        }

标签: javasynchronization

解决方案


我认为您想将锁与信号量结合使用。

  • tryLock在锁上
  • 如果你得到它,做工作。在工作结束时,将信号量标记为完成
  • 如果你没有得到它,等待信号量完成

推荐阅读