use initialization-on-demand holder idiom

This gives us a highly efficient thread-safe "singleton" cache, without synchronization overhead...
(lecture: https://en.wikipedia.org/wiki/Initialization-on-demand_holder_idiom)

The access modifier for the constructor was changed to private as this is normal for a singleton class.