https://medium.com/javarevisited/how-to-initialize-a-singleton-with-double-checked-locking-in-java-dfa641e1d63b