I have used this pattern too. I like it.
One small problem is that depending on how your threading and cache works it might be possible for the cache to be cleared after the contains call but before the get.
One small problem is that depending on how your threading and cache works it might be possible for the cache to be cleared after the contains call but before the get.