looks great, will merge it as soon as I can. got a couple of notes/questions:
any reason you used ConcurrentHashMap instead of a regular HashMap for ttls Map? we'll have to synchronize access to it ourselves anyway.
instead of making checkExpiration() and clearExpiration() synchronized I would make the methods that call it be synchronized (which I believe they already are)
looks great, will merge it as soon as I can. got a couple of notes/questions: