Wielu programistów próbowało zoptymalizować to w następujący sposób:

Sprawdź, czy zmienna jest zainicjowana (bez uzyskiwania blokady). Jeśli jest zainicjowana, to zwróć ją natychmiast, Uzyskaj blokadę, Sprawdź dwa razy, czy jest właśnie zainicjowana. Jeśli inny wątek uzyskał blokadę pierwszy, to może zainicjował już tę zmienną. Jeśli tak, to natychmiast zwróć zainicjowaną zmienną, W przeciwnym razie, zainicjuj i zwróć tę zmienną.

// Błędna wersja wielowątkowa // "Blokada z podwójnym zatwierdzeniem" class Foo { private Helper helper = null; public Helper getHelper() { if (helper == null) { synchronized(this) { if (helper == null) { helper = new Helper();

return helper;

// inne funkcje i metody... }

Intuicyjnie ten algorytm wydaje się być efektywnym rozwiązaniem problemu. Jednak ten sposób niesie ze sobą wiele subtelnych problemów i powinien być unikany. Przykładowo, rozważmy poniższą sekwencję zdarzeń: