3

Is there a way to get something like isLocked status of a Lock?

What I am doing is acquiring a lock before a loop operation and releasing it only after a certain condition is met AND the lock is already locked. So I need it ask the lock if it is already locked and I can't seem to find a way in the API to do it.

4

5 回答 5

4

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

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

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

于 2013-07-25T01:32:54.717 回答
1
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
}

看到这个

于 2013-07-25T01:29:36.920 回答
1

你正在使用什么实现? ReentrantLock类有

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

于 2013-07-25T01:30:19.363 回答
0

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

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

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

于 2013-07-25T01:38:55.753 回答
0

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

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

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

于 2013-07-25T17:14:50.640 回答