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

时间:2013-07-25 01:25:16

标签: java multithreading concurrency locking

有没有办法获得isLocked的{​​{1}}状态?

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

5 个答案:

答案 0 :(得分:3)

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

Lock是一个界面,因此只要你需要的是ReentrantLock的任何实现,那么isLocked()就有{{1}}方法;但是,我不确定为什么你只想要它,如果它目前被锁定。

确保这不是XY-Problem的情况。或者你只是说如果它已经解锁你就不需要解锁它?

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

听起来你只想对循环的前几次迭代进行锁定,但是在之后不进​​行锁定的情况下保持循环。这充其量是尴尬的。用类似的东西你会更安全。

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

这仍然看起来很奇怪,因为我无法想到你需要只保护前几个循环然后爆发的情况。

答案 4 :(得分:0)

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

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

您需要重新考虑一下您的同步。也许接受需要多个锁定线程。或者,如果你真的想要将锁定责任从线程传递给线程,也许是某种类型的relay-race-baton字段,那么每个线程都准确地知道它应该负责什么。