I benchmarked ThreadLocals using Lucene's benchmarking framework and it was significantly slower than using volatile. The rationale for ActivityTimeMonitor is that 99.9% of the time the system is healthy and the many calls to checkForTimeout only check a single volatile boolean and carry on with their business.