Wątek A zauważa, że zmienna nie jest zainicjowana, więc uzyskuje blokadę i zaczyna inicjalizować zmienną, W związku z semantyką części języków programowania, kod generowany przez kompilator może uaktualnić współdzieloną zmienną, by wskazać na częściowo skonstruowany obiekt zanim wątek A zakończy inicjalizację, Wątek B zauważa, że współdzielona zmienna została zainicjowana (lub wydaje się być taką) i zwraca wartość. Ponieważ wątek B myśli, że zmienna została właśnie zainicjowana, więc nie uzyskuje na nią blokady. Jeśli zmienna jest używana zanim A zakończy jej inicjalizację, to program prawdopodobnie się „wysypie”.

Jedno z niebezpieczeństw używania blokady z podwójnym zatwierdzeniem w języku Java w wersjach 1.4 lub wcześniejszych jest to, że często wydaje się działać. Nie jest łatwo odróżnić poprawną implementację techniki od takiej, która ma jakiś subtelne problemy. Zależy to od kompilatora, planisty procesów i wątków i sposobu działania innych części wielowątkowego systemu. Odtworzenie takich błędów może być zatem trudne.

Ten problem został rozwiązany w Javie od wersji 1.5. Teraz słowo kluczowe volatile zapewnia poprawną obsługę instancji singletonu nawet w sytuacji dużej ilości tych samych wątków.