【问题标题】:How to get locked/unlocked status of java.util.concurrent.locks.Lock如何获取 java.util.concurrent.locks.Lock 的锁定/解锁状态
【发布时间】:2013-07-25 01:25:16
【问题描述】:

有没有办法获得类似isLockedLock 的状态?

我正在做的是在循环操作之前获取一个锁,并且只有在满足某个条件并且锁已经被锁定后才释放它。所以我需要它询问锁是否已被锁定,我似乎无法在 API 中找到方法来执行此操作。

【问题讨论】:

    标签: java multithreading concurrency locking


    【解决方案1】:

    如果免费,您可以使用tryLock() 获取Lock

    Lock是一个接口,所以只要你需要一个Lock的任何实现,那么ReentrantLock就有一个isLocked()方法;但是,我不确定为什么您只希望它当前被锁定。

    确保这不是XY-Problem 的情况。还是说如果已经解锁就不需要解锁了?

    【讨论】:

    • 是的,untimed tryLock 方法不支持公平设置。很公平。尽管如此,ReentrantLock 似乎很适合您的目的。
    【解决方案2】:
    if (lock.tryLock())
    {
        // Got the lock
        try
        {
            // Process record
        }
        finally
        {
            // Make sure to unlock so that we don't cause a deadlock
            lock.unlock();
        }
    }
    else
    {
        // Someone else had the lock, abort
    }
    

    this

    【讨论】:

      【解决方案3】:

      您使用的是什么实现? ReentrantLock 类有it

      所以你可能想使用这个类型作为参考,而不是接口

      【讨论】:

        【解决方案4】:

        听起来您只想在循环的前几次迭代中拥有锁,但之后继续在没有锁的情况下循环。这充其量是尴尬的。使用类似的东西会更安全。

        lock.lock();
        try
        {
          while (!certainCondition() && loopCondition())
          {
            doWork();
          }
        } finally
        {
          lock.unlock();
        }
        while (loopCondition())
        {
          continueWork();
        }
        

        这似乎仍然很奇怪,因为我想不出你只需要保护前几个循环然后就爆发的情况。

        【讨论】:

        • 我实际上只想锁定以获取链表中的第一项,一旦我这样做了,我就准备释放锁定。我不想在所有迭代期间都保持锁定
        • 在这种情况下,您应该能够使用标准的锁定语法,并且在进入循环之前获取第一项。
        【解决方案5】:

        你正在做的事情是行不通的。对isLocked 方法的调用只会告诉您在调用期间的某个时刻锁定了锁。它通过返回 true 来做到这一点。如果它返回 false,那么它什么也没告诉你。 (正如 ReentrantLock 文档所暗示的那样,这个 可以 很有用,因为 如果 它返回 true,你知道某处的某个其他线程 确实 锁定了它;代码这样做存在并且有时会执行。如果它返回false,你什么都不知道。调用这个方法足够多次,你可能会得到有用的统计信息——这似乎是这个方法的用途。)

        可能性没有限制。如果isLocked 返回 true,则可能有 500 个线程锁定它,每个线程完成大量工作,并在调用开始执行后的语句之前释放它。如果它返回 false,则可能会发生同样的事情。无论哪种情况,您都不知道在下一条语句开始执行时它是否已锁定。 (如果您知道它在开始时被锁定,那么在开始后 2 纳秒 您将一无所知。)

        您需要重新考虑一下您的同步。也许接受多个锁定线程的需要。或者,如果你真的想在线程之间传递锁定责任,也许是某种中继竞赛指挥棒字段,所以每个线程都知道它的职责。

        【讨论】:

          猜你喜欢
          • 2021-02-17
          • 1970-01-01
          • 2012-12-04
          • 1970-01-01
          • 1970-01-01
          • 2023-03-19
          • 1970-01-01
          • 2012-12-09
          • 1970-01-01
          相关资源
          最近更新 更多