(Polski) Singleton z double-checked locking oraz problem z wielowątkowością w TestNG

Wyczytałem ostatnio w mądrych książkach, że synchronizacja singletonów na poziomie metody getInstance może w środowisku wielowątkowym znacznie (25%) spowolnić pobieranie instancji obiektu przechowywanego przez owy singleton. W przypadku, gdy wydajność ma dla nas kluczowe znaczenie, do tworzenia singletonów zalecano stosowanie wzorca double-checked locking. Jak to przeczytałem chciałem sobie sprawdzić o ile rzeczywiście mechanizm synchronizacji spowalnia cały proces. Napisałem więc trzy singletony:

tradycyjny

i dwie różne implementacje double-checked locking

Przetestowałem ich działanie poniższym testem dla różnej ilości wątków (100-10000):

Co dziwne, czasowe wyniki działania tych testów były właściwie identyczne, lub różnica była zaniedbywalna. Testy przeprowadzałem na . Nie testowałem wydajności na Java 1.4 bo istnieje prawdopodobieństwo wystąpienia problemu błędnej implementacji volatile.

Zastanawiam się zatem, dlaczego nie mogę zobaczyć tej ‘nieefyktowności synchronizacji’ getInstance z SimpleSingleton.java. Być może kompilator JIT zoptymalizował mi kod którejś z moich metod getInstance, nie umiem użyć wielowątkowości w TestNG, albo może jest jakaś inna przyczyna, o której nie mam zielonego pojęcia?

Aby wyeliminować moją ewentualną nieumiejetność posługiwania sie TestNG, dopisałem jeszcze metody testujące, w których ciele samemu n razy pobieram w nowych wątkach instancję obiektu z singletona:

Tutaj też nie widać w ogóle spadku wydajności synchronizacji na poziomie całej metody. Znajdzie się ktoś życzliwy, kto naprowadzi mnie gdzie w toku mojego ‘myślenia’ jest błąd? :)

Projekt eclise: pobierz