Java:如何检查是否可以获取锁?

时间:2011-05-26 09:37:30

标签: java multithreading locking synchronized

如果我想确保用Java独占访问对象,我可以这样写:

...
Zoo zoo = findZoo();
synchronized(zoo)
{
    zoo.feedAllTheAnimals();
    ...
}

有没有办法检查对象当前是否已被锁定?如果另一个线程正在访问zoo,我不希望我的线程等待。如果未锁定zoo,我希望我的线程获取锁并执行synchronized块;如果没有,我希望它跳过它。

我该怎么做?

3 个答案:

答案 0 :(得分:7)

使用Java中嵌入的低级本机同步无法实现此目的。但是您可以使用并发包中提供的高级API来完成它。

Lock lock = new ReentrantLock();
....
//some days later
....
boolean isLocked = lock.tryLock();

答案 1 :(得分:5)

您可以使用Lock.tryLock()。更具体地说,java.util.concurrent.locks.ReentrantLock

答案 2 :(得分:1)

你也可以手动完成。虽然你已经用ReentrantLock获得了令人满意的答案;)

private boolean flag;
private final Object flagLock = new Object();
private final Object actualLock = new Object();

//...

boolean canAquireActualLock = false;
synchronized (flagLock) {
    if (!flag) {
        flag = canAquireActualLock = true;
    }
}
if (canAquireActualLock) {
    try {
        synchronized (actualLock) {

            // the code in actual lock...

        }
    } finally {
        synchronized (flagLock) { flag = false; }
    }
}

当然你可以用方便的方法包装。