2012-01-02 16 views

Odpowiedz

25

Użyj volatile, aby zagwarantować, że każdy dostęp odczytu do zmiennej będzie widział najnowszą wartość zapisaną do tej zmiennej. Użyj wartości synchronized, gdy potrzebujesz wartości, aby zachować stabilność dla wielu instrukcji. (Zauważ, że nie musi to oznaczać wiele instrukcji; pojedynczego komunikatu.

var++; // NOT thread safe! 

jest nie wątku bezpieczny nawet jeśli var deklaruje volatile Trzeba to zrobić:

synchronized(LOCK_OBJECT){var++;} 

See here za ładne podsumowanie tego numeru:

+0

'AtomicLong' obsługuje' var ++ 'za pomocą metody i tylko' volatile'. Czy możesz edytować swoją odpowiedź, aby podać lepszy przykład? – Gray

+0

@Gray - Okay. Moim "lepszym przykładem" jest to, że 'var' jest typu' float'. –

3

To dość szerokie pytanie. Najlepszą odpowiedzią, jaką mogę dać, jest użycie synchronized podczas wykonywania wielu działań, które muszą być widoczne w innych wątkach jako występujące w postaci atomowej — - wszystkie lub żadne z kroków nie wystąpiły.

Dla pojedynczego działania może być wystarczająca wartość volatile; działa jako bariera pamięci, aby zapewnić widoczność zmiany na inne wątki.

9

Funkcja "Lotna" zapewnia, że ​​operacja odczytu zawsze zapewnia najnowszy stan z pamięci przez wątki. nie zapewniają żadnego bezpieczeństwa zapisu/porządkowania operacji, tj. dwa wątki mogą aktualizować zmienną lotność w dowolnej kolejności losowej. Również nie zapewnia, że ​​wiele operacji na zmiennej jest atomowych.

Jednak zsynchronizowany blok zapewnia najnowszy stan i bezpieczeństwo zapisu. Również dostęp i aktualizacja zmiennej ma charakter atomowy wewnątrz zsynchronizowanego bloku. Powyższe jest jednak prawdziwe, tylko jeśli wszystkie dostęp/aktualizacje danej zmiennej korzystają z tego samego obiektu blokady, tak że w wielu momentach nic nie uzyskuje dostępu do zmiennej.

0

Ulotność nie zyskuje blokady, wykorzystuje bazową architekturę procesora, aby zapewnić widoczność we wszystkich wątkach po zapisie.

Powiązane problemy