erm.. I think there is a bug in this code now. Imagine two threads coming one after the other in a cache miss scenario. First thread will do a cache.get, acquire the mutex and do a get on the backing store. In the mean time second thread will do a cache.get, get a miss and block on getFromBackingStore till the first thread is done. Then it will acquire the lock, do a get on the backingstore again and repopulate the cache. I think you may need to do a cache get inside the  getFromBackingStore function, just to check that cache is not already populated by the previous thread.