2012-04-12 11 views
9

Czy jest jakiś powód, aby używać niestabilnego i zsynchronizowanego razem w tym kodzie?Niestabilna ze zsynchronizowanym razem

public class Helper { 
    private volatile int n; 
    private final Object lock = new Object(); 
    public Helper(int n) { 
    this.n = n; 
    } 

    public void setN(int value) { 
    synchronized (lock) { 
     n = value; 
    } 
    } 
} 

Pomoc klasa musi być bezpieczna dla wątków. Mam tego przykładu z książki "Java Concurrency Guidelines", ale nadal nie jest jasne: jaki jest powód używania niestabilne i zsynchronizowane razem w tym przykładzie?

+1

Jaka jest dokładnie książka, o której mówisz? Zdecydowanie poleciłbym podręcznik Java Concurrency in Practice (http://jcip.net/), aby poznać współbieżność Java. –

+0

Znalazłem tę książkę tutaj (strona 167) http://www.sei.cmu.edu/reports/10tr015.pdf Wszystko w tej książce jest całkiem jasne, z wyjątkiem tego przypadku tylko –

+0

Użyj AtomicInteger. – khachik

Odpowiedz

7

Celem tego przykładu jest podkreślić, że syncronized bez volatile nie wystarczy w tym przypadku, biorąc pod uwagę fakt, że obiekt może zostać opublikowany niebezpieczny (czyli bez volatile w Foo):

Jeśli pomocnik pole w klasie Foo nie jest zadeklarowane jako zmienne, pole n powinno być deklarowane jako zmienne, tak aby ustalono relację pomiędzy relacjami między inicjalizacją n a zapisem Pomagającego w polu pomocnika. Jest to zgodne z wytyczną "VNA06-J. Nie zakładaj, że deklarowanie referencji obiektu lotnego gwarantuje widoczność jego członków "na stronie 35. Jest to wymagane tylko wtedy, gdy osoba dzwoniąca (klasa Foo) nie może być zaufana, aby zadeklarować pomocnika zmiennego.

Zgadza się, ale wybrali zły przykład, aby to zademonstrować, ponieważ w tym przypadku wystarczy volatile bez synokonizacji.

0

Chyba że lotny jest używany ponieważ „n” jest ustawiona w konstruktorze

+0

Tak, ale z jakiego powodu używać synchronizacji w metodzie setN? –

+0

Och, naprawdę? Nie wiem, jak wywołać konstruktora tego samego obiektu z 2 lub więcej wątków, prawda? – hsestupin

+0

Ja też nie wiem) Moje pytanie dotyczyło tego, dlaczego potrzebna jest synchronizacja w metodzie setN. Jeśli zmienna n jest zmienna, seter może być bez dodatkowej synchronizacji. Albo nie? –

1

To nie jest konieczne, aby umieścić zsynchronizowany blok wokół zmiany wartości; od wersji 5 Java jest wykonywana "automatycznie" dla zmiennych zmiennych. Wydaje mi się, że poprzednio w przypadku Java 5 nie było to konieczne.

Powiązane problemy