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

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

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

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

我怎样才能做到这一点?

您无法使用Java中嵌入的低级本机同步来完成此操作。 但您可以使用并发程序包中提供的高级API来完成此操作。

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

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

你也可以手动完成。 虽然你已经用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; } } } 

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