Strictly speaking, we should only release if the call to acquire actually succeeded (so do the acquire before the try-finally). That's a pain because then you need two nested try blocks, to catch the outer `InterruptedException` though. No particularly strong feelings.