ReentrantLock: avoid concurrency with timer

Note that if you continue to queue new commands faster than you process them, you will eventually run out of memory.