I was reading this article about ‘Double-Checked locking’ and out of the main topic of the article I was wondering why at some point of the article the author uses the next Idiom:
Listing 7. Attempting to solve the out-of-order write problem
public static Singleton getInstance() { if (instance == null) { synchronized(Singleton.class) { //1 Singleton inst = instance; //2 if (inst == null) { synchronized(Singleton.class) { //3 inst = new Singleton(); //4 } instance = inst; //5 } } } return instance; }
And my question is: Is there any reason to synchronize twice some code with the same lock? Have this any purpose it?
Many thanks in advance.
The point of locking twice was to attempt to prevent out-of-order writes. The memory model specifies where reorderings can occur, partly in terms of locks. The lock ensures that no writes (including any within the singleton constructor) appear to happen after the ‘instance = inst;’ line.
However, to go deeper into the subject I’d recommend Bill Pugh’s article. And then never attempt it 🙂