2010-07-09 8 views
13

Czy zmienna dostępna dla wielu wątków, ale tylko wewnątrz zsynchronizowanych bloków, wymaga modyfikatora lotnego? Jeśli nie, dlaczego?Jawny modyfikator lotny i zsynchronizowane bloki

+1

Możesz również być zainteresowany tym pytaniem: http://stackoverflow.com/questions/3103204/difference-between-synchronization-of-field-reads-and- volatile –

+0

Nie. Odnoś się do tego zaległego pytania SE: http : //stackoverflow.com/questions/3519664/difference-between-volatile-and-synchronized-in-java/34355995#34355995 –

Odpowiedz

8

Nie trzeba używać volatile wewnątrz synchronized, zsynchronizowane już gwarantuje prawidłowe zachowanie dla lokalnego buforowania zmiennych, gdy jest używane konsekwentnie (przy każdym dostępie).

działa na wartościach pierwotnych i może być dobrym skrótem dla dostępu atomowego do typu pierwotnego. Zwróć uwagę, że zachowanie volatile zmieniło się w JDK 5 z wersji 1.4.

Więcej informacji można znaleźć here

4

Nie. Podczas pracy w zsynchronizowanym bloku wszystkie zmienne buforowane są synchronizowane podczas dostępu, ponieważ tworzą barierę pamięci.

Aby uzyskać szczegółowe informacje, zobacz porównanie (z dyskusją) pod numerem volatile to synchronized.

2

Bloki, które synchronizują się na tym samym obiekcie (lub metody) są gwarantowane nie być uruchamiane w tym samym czasie. Tak więc tak długo, jak synchronizujesz do tego samego obiektu, twoja zmienna nigdy nie będzie miała dostępu współbieżnego, więc nie wymaga specjalnej obróbki.

Jeśli dostęp nie jest zsynchronizowany, oznacza to, że masz wyścig. Wprowadzanie zmiennej volatile może być poprawne w przypadku niektórych zmiennych pierwotnych (odradzam innym postom, aby uzyskać lepsze informacje o volaitle). Jeśli to nie przyda się, prawie na pewno masz błąd.

+1

Aby być pedantycznym, synchronizacja w innych językach nie oznacza stałej pamięci - wartość może być buforowana w rejestru lub pamięć lokalną, a nawet jeśli dostęp jest zsynchronizowany, może nie być atomowy/spójny. Jednak w języku Java synchronizacja włącza się automatycznie. –

+1

Aby być równie pedantycznym, inne języki, o których prawdopodobnie myślisz (C/C++), nie mają wbudowanego pojęcia synchronizacji wątków, a nawet słowa kluczowego "zsynchronizowanego"; musisz skonstruować coś podobnego do muteksów. Masz rację: nie ma czasu, aby zarządzać spójnością pamięci dla ciebie. Te języki nie określają nawet żadnej semantyki dostępu do pamięci współbieżnej! Na szczęście Java jest dobra i po prostu robi to, czego się spodziewasz. – Karmastan

+0

@ YannRamin Jako w, zmienna, na której dokonujesz synchronizacji, jest efektywna w lotności w celu modyfikacji jej dokonanych w tym zsynchronizowanym bloku? Nie jestem pewien, czy dobrze cię zinterpretowałem, ale nie mogę znaleźć opisu tego efektu w innym miejscu. – spieden