2012-07-13 23 views
5

Rozważmy następujący kod, chcę, aby to bezpieczne klasę gwintu, tak że nigdy nie dostanie liczba nieparzysta:Czy mogę używać zsynchronizowany do końcowego pola?

class Test { 
    private int value = 0; 
    private final Object lock; 

    public void add() { 
    synchronized (lock) { 
     value++; 
     value++; 
    } 
    } 

    public int getValue() { 
    synchronized (lock) { 
     return value; 
    } 
    } 
} 

jestem teraz wątpliwości pola blokady, co jest uznane za ostateczne, to będzie materia? lub złamie bezpieczeństwo wątku?

Myślę, że jeśli pole blokady nie zostanie zadeklarowane jako ostateczne, powinno to być klasa bezpieczna dla wątków. Jeśli ten wniosek jest błędny, popraw mnie, dziękuję.

+0

Zobacz pytanie [this] (http://stackoverflow.com/questions/2101327/final-variable-andsynchronized-block-in-java). – Lion

Odpowiedz

9

Mam teraz wątpliwości, czy pole zamka, które jest zadeklarowane jako ostateczne, czy to będzie miało znaczenie?

Tak, jego rozważyć najlepsze praktyki tylko zablokować final obiektów terenowych.

Jeśli możesz zmienić referencję, możesz zmienić, który obiekt jest zablokowany, zrywając bezpieczeństwo wątku.

0

W języku Java synchronizacja jest wykonywana przez ukryte pole obiektu blokady. Również końcowy oznacza, że ​​REFERENCJE jest ostateczne, a nie sam obiekt.

Przykład:

final Bar bar = new Bar(); //bar hase property lock 
bar.lock = XYZ; //will work, object is not FINAL 
bar = new Bar(); //fail, the reference is FINAL 
+0

Co jest warte, nie ma żadnego wbudowanego konstruktu, który powodowałby, że "obiekty byłyby ostateczne" w Javie. Niezmienność należy wymuszać programowo. – corsiKa

1

powinien być OK. może nawet uczynić to bezpieczniejszym, ponieważ nie można po prostu przypisać czegoś innego do blokady podczas wykonywania.

1

Jeśli szukasz, aby zablokować instancji, a następnie końcowy jest dopuszczalne. Jeśli chcesz zablokować lub umieścić muteks na klasie, ustaw zmienną statyczną.

0

Podczas próby synchronizacji wielu wątków należy je zsynchronizować w oparciu o to samo odwołanie do obiektu/instancję. Gwarantuje to, że oba będą synchronizować w tym samym czasie na podstawie tych samych danych.

Nadzieję, że ma sens; musisz tylko synchronizować w oparciu o sfinalizowaną zmienną, a nie dynamiczną.

Jeśli metoda modyfikuje pole statyczne, trzeba zsynchronizować dostęp do tej dziedzinie, nawet jeśli metoda jest zazwyczaj używany tylko przez jednego wątku. Klienci nie mogą wykonywać zewnętrznej synchronizacji w takiej metodzie, ponieważ nie można zagwarantować, że niezwiązani klienci wykonają taką samą operację, see.

Powiązane problemy