Wpis z mikrobloga

Mirki z #programowanie oraz #java , szybkie pytanie:
Jeśli klasa ma dwie metody synchronized, to gdy wywoła się jedną, to automatycznie blokuję możliwość wywołania drugiej, do czasu aż nie skończy się ta pierwsza? Prawdę mówiąc, myślałem że synchronized blokuje jedynie możliwość duplikowania się jednej, konkretnej metody.
  • 13
  • Odpowiedz
@wafel93: Nie, monitor dla obiektu jest jeden, dla klasy też jeden. Metody statyczne nie zablokują się nawzajem w obrębie klasy, a metody obiektu nie zablokują się nawzajem w ramach jednego obiektu.
  • Odpowiedz
@informatyk15000k: W takim wypadku zastanawiam się: dlaczego w obiekcie, w którym jedna z metod modyfikuje na bieżąco pewną wartość, a druga ją pobiera - nie występują żadne konflikty, jeśli getValue jest także synchronized :| (konflikty - getValue nie pobiera zmiennej w trakcie wykonywania pierwszej metody, obsługują je dwa różne wątki)
  • Odpowiedz
@wafel93: https://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html

First, it is not possible for two invocations of synchronized methods on the same object to interleave. When one thread is executing a synchronized method for an object, all other threads that invoke synchronized methods for the same object block (suspend execution) until the first thread is done with the object.

Second, when a synchronized method exits, it automatically establishes a happens-before relationship with any subsequent invocation of a
  • Odpowiedz
W takim wypadku zastanawiam się: dlaczego w obiekcie, w którym jedna z metod modyfikuje na bieżąco pewną wartość, a druga ją pobiera - nie występują żadne konflikty, jeśli getValue jest także synchronized :| (konflikty - getValue nie pobiera zmiennej w trakcie wykonywania pierwszej metody, obsługują je dwa różne wątki)


@wafel93: Bo blok synchronized i metoda synchronized używają tego samego monitora. Przy wejściu do pierwszej metody zostaje on zablokowany a odblokowany dopiero
  • Odpowiedz
@leoha: @informatyk15000k: tak jeszcze gwoli ścisłości, bo coś nie widzę tego w mojej książce - jeśli zastosujemy zsynchronizowaną metodę statyczną to zablokowana będzie klasa, tak? Mam rozumieć, że dotyczy to także wszystkich jej instancji do czasu zakończenia tej statycznej metody, czy czego konkretnie?
  • Odpowiedz
@wafel93: analogicznie: żadne dwie metody statyczne nie będą się przeplatać, ale metody instancji już mogą (no chyba, że zrobisz gdzieś blok synchronized(Klasa.class) { }
  • Odpowiedz
@leoha: Dzięki, Twoje wyjaśnienie mi jak na razie wystarczy - po ksiażce przeczytam cały kurs Oracla w tym temacie, na razie nie chcę mieszać sobie wątków :>
  • Odpowiedz