2012-02-24 12 views
19

Ciągle czytam o tym, jak tendencyjne blokowanie, przy użyciu flagi -XX: + UseBiasedLocking, może poprawić wydajność niezapowiedzianej synchronizacji. Nie mogłem znaleźć odniesienia do tego, co robi i jak poprawia wydajność.Biased locking in java

Czy ktoś może mi wyjaśnić, co to jest lub może wskazywać na linki/zasoby, które wyjaśniają?

Odpowiedz

26

Zasadniczo, jeśli obiekty są zamknięte tylko przez jeden wątek, VM może dokonać optymalizacji oraz " stronniczość ", która sprzeciwiła się temu wątkowi w taki sposób, że późniejsze operacje atomowe na obiekcie nie pociągają za sobą kosztów synchronizacji. Przypuszczam, że jest to zwykle nastawione na zbyt konserwatywny kod, który wykonuje blokady obiektów bez ujawniania ich innemu wątkowi. Faktyczna narzuta synchronizacji zostanie uruchomiona tylko wtedy, gdy inny wątek spróbuje uzyskać blokadę obiektu.

To jest domyślnie włączona w Javie 6.

-XX: + UseBiasedLocking Umożliwia techniki poprawy wydajności uncontended synchronizacji. Obiekt jest "stronniczy" w kierunku wątku, który po raz pierwszy pozyskuje swój monitor za pośrednictwem kodu ID monitorenter lub zsynchronizowanego wywołania metody; kolejne operacje związane z monitorowaniem wykonywane przez ten wątek są relatywnie znacznie szybsze na maszynach wieloprocesorowych. Niektóre aplikacje ze znaczną ilością synchronizacji niezakontraktowanej mogą uzyskać znaczne przyspieszenia z włączoną tą flagą; niektóre aplikacje z pewnymi wzorcami blokowania mogą widzieć spowolnienia, chociaż podjęto próby minimalizacji negatywnego wpływu.

5

Czy to nie odpowiada na twoje pytania?

http://www.oracle.com/technetwork/java/tuning-139912.html#section4.2.5

Umożliwia techniki poprawy wydajności uncontended synchronizacji. Obiekt jest "tendencyjny" w kierunku wątku, który najpierw uzyskuje swój monitor przez kodowanie z monitorenter lub zsynchronizowane wywołanie metody; kolejne operacje związane z monitorami wykonywane przez , że wątek jest relatywnie dużo szybszy na maszynach wieloprocesorowych. Niektóre aplikacje ze znacznymi ilościami niezamocowanych synchronizacji mogą uzyskać znaczne przyspieszenia z włączoną tą flagą ; niektóre aplikacje z niektórymi wzorcami blokowania mogą powodować spowolnienie działania, chociaż podjęto próby minimalizacji negatywnego wpływu.

Chociaż domyślam się, że domyślnie jest włączony w wersji 1.6. Użyj opcji diagnostycznej PrintFlagsFinal, aby zobaczyć, jakie są efektywne flagi. Upewnij się, że podasz -server jeśli śledztwo dla aplikacji serwera, ponieważ flagi mogą się różnić:

http://www.jroller.com/ethdsy/entry/print_all_jvm_flags

3

Ja osobiście zastanawiałem się, czy nie są to obiektywne blokady.

Wygląda jednak na to, że nieobiektywne blokady java są wolniejsze w procesorach nehalem firmy Intel niż w zwykłych blokadach, i prawdopodobnie w dwóch generacjach procesorów od czasów nehalem.Zobacz http://mechanical-sympathy.blogspot.com/2011/11/java-lock-implementations.html a tu http://www.azulsystems.com/blog/cliff/2011-11-16-a-short-conversation-on-biased-locking

także Więcej informacji tutaj https://blogs.oracle.com/dave/entry/biased_locking_in_hotspot

Mam nadzieję, że istnieje jakiś stosunkowo tani sposób odwołać tendencyjne blokadę na intel, ale zaczynam wierzyć, że nie jest możliwy. Artykuły, które widziałem na temat tego, jak to się robi, polegają na: 1) wysyłaniu sygnału, tj. Uruchomieniu kodu w innym wątku 3) z bezpiecznymi punktami, które gwarantują sprawiedliwe działanie często w drugim wątku i czeka na wykonanie (tak robi java). 4) mając podobne bezpieczne punkty, które są wezwaniem do zwrotu - a drugi wątek MODYFIKUJE KOD do punktu przerwania ...