wpadłem na pewien (produkcja!) Kodu, który wygląda tak jak na poniższym fragmencie:Przypisywanie obiektu w zsynchronizowanym bloku opartego na tym obiekcie (Java)
synchronized(some_object) {
some_object = new some_object()
}
bym tego spodziewać podlegają wszelkiego rodzaju okropnych warunków wyścigowych i że drugi wątek może ewentualnie wejść do tego bloku, w którym tworzony jest nowy obiekt. Moje układy Java nie są wystarczająco dobre, aby stanowczo określić oczekiwane zachowanie powyższych, tak ciekawe, co ludzie mają do powiedzenia, zanim to zmienię.
To nie jest tak napisane. W moim przypadku klasa ma zmienną some_object, która jest używana dla bloku synchronizacji, i ta zmienna jest ponownie przypisywana w tym samym bloku. –
+1 Kluczem tutaj jest to, że synchronizacja odnosi się do obiektu, a nie do referencji. Po wykonaniu i przypisaniu 'new' nadal jesteś zablokowany na starym obiekcie. Nowy obiekt nie jest w tym momencie zablokowany. Po zsynchronizowaniu bloku blokada starego obiektu zostaje zwolniona i jeśli nie istnieją żadne inne odniesienia do niego, kwalifikuje się do gc. Jeśli w rzeczywistym zsynchronizowanym bloku jest więcej kodu i zależy to od tego, czy blokada w jakiś sposób przenosi się do nowego obiektu, może to być problem. –
Dzięki Jim. Fakt, że zamek jest na obiekcie, a nie odniesienie, ma dla mnie sens. To, na czym się nie skupiałem, polegało na zmianie obiektu, do którego odnosi się ta zmienna, czy inny wątek zobaczy inny odblokowany obiekt i ponownie przejdzie do bloku, czy też mechanizmy zsynchronizowanego bloku zapobiegną temu? –