Lazy Initialization, Singleton Pattern and Double Checked locking