如何获取java.util.concurrent.locks.Lock的锁定/解锁状态



有没有一种方法可以获得锁的isLocked状态?

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

如果Lock是免费的,您可以使用tryLock()来获得它。

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

请确保这不是XY问题。或者你只是说,如果它已经解锁,你就不需要解锁了?

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
}

请参阅此

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

因此,您可能希望使用此类型作为参考,而不是接口

听起来你只想在循环的前几次迭代中使用锁,但之后继续循环而不使用锁。这充其量是尴尬的。有这样的东西你会安全得多。

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

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

你所做的不会奏效。对isLocked方法的调用只会告诉您锁在调用过程中的某个时刻被锁定。它通过返回true来实现这一点。如果它返回false,则说明它什么也没告诉你。(正如ReentrantLock文档所暗示的,这个可以很有用,因为如果它返回true,你知道在某个地方有其他线程锁定它;这样做的代码存在,有时会执行。如果它返回false,你什么都不知道。调用这个方法足够多次,你可能会得到有用的统计信息——这似乎就是这个方法的作用。)

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

你需要重新考虑一下你的同步。也许可以接受对多个锁定线程的需求。或者,如果你真的想把锁定责任从一个线程传递到另一个线程,也许是某种接力赛接力棒场,这样每个线程都确切地知道它负责什么。

最新更新