【发布时间】:2013-07-25 01:25:16
【问题描述】:
有没有办法获得类似isLockedLock 的状态?
我正在做的是在循环操作之前获取一个锁,并且只有在满足某个条件并且锁已经被锁定后才释放它。所以我需要它询问锁是否已被锁定,我似乎无法在 API 中找到方法来执行此操作。
【问题讨论】:
标签: java multithreading concurrency locking
有没有办法获得类似isLockedLock 的状态?
我正在做的是在循环操作之前获取一个锁,并且只有在满足某个条件并且锁已经被锁定后才释放它。所以我需要它询问锁是否已被锁定,我似乎无法在 API 中找到方法来执行此操作。
【问题讨论】:
标签: java multithreading concurrency locking
如果免费,您可以使用tryLock() 获取Lock。
Lock是一个接口,所以只要你需要一个Lock的任何实现,那么ReentrantLock就有一个isLocked()方法;但是,我不确定为什么您只希望它当前被锁定。
确保这不是XY-Problem 的情况。还是说如果已经解锁就不需要解锁了?
【讨论】:
tryLock 方法不支持公平设置。很公平。尽管如此,ReentrantLock 似乎很适合您的目的。
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
【讨论】:
您使用的是什么实现?
ReentrantLock 类有it
所以你可能想使用这个类型作为参考,而不是接口
【讨论】:
听起来您只想在循环的前几次迭代中拥有锁,但之后继续在没有锁的情况下循环。这充其量是尴尬的。使用类似的东西会更安全。
lock.lock();
try
{
while (!certainCondition() && loopCondition())
{
doWork();
}
} finally
{
lock.unlock();
}
while (loopCondition())
{
continueWork();
}
这似乎仍然很奇怪,因为我想不出你只需要保护前几个循环然后就爆发的情况。
【讨论】:
你正在做的事情是行不通的。对isLocked 方法的调用只会告诉您在调用期间的某个时刻锁定了锁。它通过返回 true 来做到这一点。如果它返回 false,那么它什么也没告诉你。 (正如 ReentrantLock 文档所暗示的那样,这个 可以 很有用,因为 如果 它返回 true,你知道某处的某个其他线程 确实 锁定了它;代码这样做存在并且有时会执行。如果它返回false,你什么都不知道。调用这个方法足够多次,你可能会得到有用的统计信息——这似乎是这个方法的用途。)
可能性没有限制。如果isLocked 返回 true,则可能有 500 个线程锁定它,每个线程完成大量工作,并在调用开始执行后的语句之前释放它。如果它返回 false,则可能会发生同样的事情。无论哪种情况,您都不知道在下一条语句开始执行时它是否已锁定。 (如果您知道它在开始时被锁定,那么在开始后 2 纳秒 您将一无所知。)
您需要重新考虑一下您的同步。也许接受多个锁定线程的需要。或者,如果你真的想在线程之间传递锁定责任,也许是某种中继竞赛指挥棒字段,所以每个线程都知道它的职责。
【讨论】: