Patch Set 1: I would prefer that you didn't submit this

How can the shared instance be immutable? A client calls read on it and data is read from disk if memory data is outdated.

I think the decoration scenario could be handled in the following way: GitLightweightDecorator cashes a DirCache instance as static member and ensures thread safety by using a private lock when using the cached DirCache instance.