If the goal of the queue is to buffer items (i.e. `checkin` that can be picked up by a different thread (the one that calls 'checkout`), then its simpler to use something like a [ArrayBlockingQueue](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ArrayBlockingQueue.html) or [LinkedBlockingQueue](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/LinkedBlockingQueue.html). No need for reentrant locks.