如果我想确保用Java独占访问对象,我可以这样写:
...
Zoo zoo = findZoo();
synchronized(zoo)
{
zoo.feedAllTheAnimals();
...
}
有没有办法检查对象当前是否已被锁定?如果另一个线程正在访问zoo
,我不希望我的线程等待。如果未锁定zoo
,我希望我的线程获取锁并执行synchronized
块;如果没有,我希望它跳过它。
我该怎么做?
答案 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; }
}
}
当然你可以用方便的方法包装。