Co oznacza ten kod java? Czy zablokuje się na wszystkich przedmiotach MyClass
?
synchronized(MyClass.class) {
//is all objects of MyClass are thread-safe now ??
}
A czym różni się powyższy kod od tego:
synchronized(this) {
//is all objects of MyClass are thread-safe now ??
}
java
multithreading
synchronization
locking
synchronized
Andrew Tobilko
źródło
źródło
Odpowiedzi:
Fragment
synchronized(X.class)
używa instancji klasy jako monitora. Ponieważ istnieje tylko jedna instancja klasy (obiekt reprezentujący metadane klasy w czasie wykonywania), w tym bloku może znajdować się jeden wątek.Z
synchronized(this)
bloku jest chroniony przez instancję. W każdym przypadku tylko jeden wątek może wejść do bloku.synchronized(X.class)
służy do upewnienia się, że w bloku znajduje się dokładnie jeden wątek.synchronized(this)
zapewnia, że na instancję przypada dokładnie jeden wątek. Jeśli to sprawia, że rzeczywisty kod w bloku jest bezpieczny dla wątków, zależy od implementacji. Jeśli mutate wystarczy tylko stan instancjisynchronized(this)
.źródło
Aby dodać do innych odpowiedzi:
jest równa
i
jest równa
źródło
synchronized
blokami. To czyni je równoważnymi. Jeśli zmienisz jeden przykład, rzeczywiście nie są już takie same.Nie, pierwsza spowoduje zablokowanie definicji klasy
MyClass
, a nie wszystkich jej instancji. Jeśli jednak zostanie użyty w instancji, skutecznie zablokuje wszystkie inne instancje, ponieważ mają one wspólną definicję klasy.Drugi blokuje tylko bieżącą instancję.
Czy to sprawia, że twoje obiekty są bezpieczne, jest to znacznie bardziej złożone pytanie - musielibyśmy zobaczyć twój kod!
źródło
Tak, będzie (na każdym zsynchronizowanym bloku / funkcji).
Nad tym pytaniem zastanawiałem się dla siebie przez kilka dni (właściwie w Kotlinie). W końcu znalazłem dobre wyjaśnienie i chcę się nim podzielić:
Blokada na poziomie klasy zapobiega wchodzeniu wielu wątków w zsynchronizowanym bloku we wszystkich dostępnych wystąpieniach klasy w czasie wykonywania. Oznacza to, że jeśli w czasie wykonywania jest 100 wystąpień DemoClass, tylko jeden wątek będzie mógł wykonać demoMethod () w dowolnej instancji na raz, a wszystkie inne wystąpienia zostaną zablokowane dla innych wątków.
Blokowanie na poziomie klasy powinno być zawsze wykonywane, aby zapewnić bezpieczeństwo wątków danych statycznych. Ponieważ wiemy, że statyczne słowo kluczowe kojarzy dane metod z poziomem klasy, użyj blokowania w statycznych polach lub metodach, aby zrobić to na poziomie klasy.
Dodatkowo warto zauważyć, dlaczego .class . Dzieje się tak dlatego, że
.class
jest odpowiednikiem dowolnej zmiennej statycznej klasy podobnej do:gdzie nazwa zmiennej blokady to class, a typ to Class <T>
Czytaj więcej: https://howtodoinjava.com/java/multi-threading/object-vs-class-level-locking/
źródło