How do determine if an object is locked (synchronized) so not to block in Java?

One thing to note is that the instant you receive such information, it’s stale. In other words, you could be told that no-one has the lock, but then when you try to acquire it, you block because another thread took out the lock between the check and you trying to acquire it.

Brian is right to point at Lock, but I think what you really want is its tryLock method:

Lock lock = new ReentrantLock();
......
if (lock.tryLock())
{
    // Got the lock
    try
    {
        // Process record
    }
    finally
    {
        // Make sure to unlock so that we don't cause a deadlock
        lock.unlock();
    }
}
else
{
    // Someone else had the lock, abort
}

You can also call tryLock with an amount of time to wait – so you could try to acquire it for a tenth of a second, then abort if you can’t get it (for example).

(I think it’s a pity that the Java API doesn’t – as far as I’m aware – provide the same functionality for the “built-in” locking, as the Monitor class does in .NET. Then again, there are plenty of other things I dislike in both platforms when it comes to threading – every object potentially having a monitor, for example!)

Leave a Comment