I'm wondering if this is a good or bad idea.  It currently sleeps for a tenth of the remaining lifespan of the lock (or up to 1 second).  If there is a slow client, this definitely reduces the number of cycles dedicated to rechecking the lock.  
On the other hand, if two clients just barely collide, this code may make one client sleep for much longer (in CPU terms) than it takes to release the lock.