ReentrantLock - 这是一种有效的使用方法

时间:2016-04-08 11:16:30

标签: java multithreading locking

我有两个方法都由不同的线程运行,其中一个方法我不想在另一个被调用时运行。这就是我选择使用锁

的原因
@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循环是否是正确的说法,我希望此线程在此处等待,直到锁定被释放或有更好的方法来实现此

由于

3 个答案:

答案 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(); 
    } 
}