我有两个方法都由不同的线程运行,其中一个方法我不想在另一个被调用时运行。这就是我选择使用锁
的原因@Override
public synchronized void doSomething(int[] params)
{
while (lock.isLocked())
{
// wait for it to become unlocked
}
//lock is released so lets do some stuff
在我的另一种方法中,我有以下实现
@Override
public void doSomethingElse(int param)
{
lock.lock();
for (int i = 0 ; i < param; i++)
{
//do some stuff
}
lock.unlock();
}
while循环是否是正确的说法,我希望此线程在此处等待,直到锁定被释放或有更好的方法来实现此
由于
答案 0 :(得分:2)
while循环正忙着等待,这绝对是你不想做的事情。
调用lock.lock();
将会阻止,直到锁定被释放为止,这是正确的方法,就像您在其他方法中所做的一样。
您也不需要第一个方法synchronized
,并且应始终在finally
子句中释放锁。
答案 1 :(得分:2)
你需要这样的东西:
private void method1()
{
lock.lock();
try {
...
} finally {
lock.unlock();
}
}
private void method2()
{
lock.lock();
try {
...
} finally {
lock.unlock();
}
}
不要伪造使用try {} finally {},否则你最终会陷入僵局。
答案 2 :(得分:0)
两者都错了,标准做法是在finally子句中解锁。否则,如果从应用锁的代码内部抛出异常,应用程序将停止:
public void doSomethingElse(int param) throws Exception {
lock.lock();
try {
//do some stuff that may throw exceptions
} finally {
lock.unlock();
}
}