This question already has an answer here:
-
How do determine if an object is locked (synchronized) so not to block in Java?
7 answers
If I want to ensure exclusive access to an object in Java, I can write something like this:
...
Zoo zoo = findZoo();
synchronized(zoo)
{
zoo.feedAllTheAnimals();
...
}
Is there a way to check if an object is currently locked? I don't want my thread to wait if another thread is accessing zoo
. If zoo
is not locked, I want my thread to acquire the lock and execute the synchronized
block; if not, I want it to skip it.
How can I do this?
You can't do it using the low-level native synchronization embedded in Java. But you can do it using the high-level APIs provided in the concurrent package.
Lock lock = new ReentrantLock();
....
//some days later
....
boolean isLocked = lock.tryLock();
you can use Lock.tryLock()
. more concretely, java.util.concurrent.locks.ReentrantLock
You may do it manually too. Although you already have satisfying answer with 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; }
}
}
Of course you could wrap with convenient methods.