Zalozmy ze mam taki kod:
public synchronized void metoda(){
metoda2();
}
gdzie metoda2() NIE JEST zsynchronizowana. I teraz czy jesli moj watek wykonuje kod z metoda() i wchodzi do metoda2() to moze zostac wywlaszczony?
Zalozmy ze mam taki kod:
public synchronized void metoda(){
metoda2();
}
gdzie metoda2() NIE JEST zsynchronizowana. I teraz czy jesli moj watek wykonuje kod z metoda() i wchodzi do metoda2() to moze zostac wywlaszczony?
co to znaczy wywłaszczony ?
Przestanie byc wykonywany i czas procesora zostanie przekazany do innego watku
Ale z jakiej paki, wątek który wykonuje metode, jakąkolwiek może przestać być wykonywany inaczej niż
Wątek wejdzie do metoda() wykona co tam ma zrobić wyjdzie i już. Nikt nie może go "wywłaszczyć"
@kdmrulez chyba nie rozumiesz co robi synchronized
. Wątek może zostać wywłaszczony właściwie w dowolnym momencie i synchronized
nie ma na to wpływu.
Może chodzi ci o to, czy drugi wątek może wleźć do metoda2()
w czasie gdy pierwszy wątek tam siedzi? Może, ale nie przez metoda()
, bo ją strzeże lock trzymany przez pierwszy wątek.
Teoretycznie mógłbyś wołać osobno metoda2()
i metoda()
z dwóch różnych wątków i jeśli masz tam jakiś zmienny stan, to może nastąpić race condition, ale to by było oznaką tego, że twój kod jest źle skonstruowany. Jak masz wszystko hermetyczne i klasy są małe, to nie powinieneś mieć tego problemu.
Dobra, rzeczywiscie im wiecej czytam o tych watkach tym rozumiem mniej zamiast wiecej :(Czyli jesli zle rozumiem synchronized to moglbys mi wytlumaczyc o co w tym chodzi?Mi sie wydawalo ze jak watek wchodzi do synchronizowanej metody to do poki jej nie opusci to zaden inny watek nie moze wlezc do innej synchronizowanej metody tego obiektu. Czyli moj watek moze zostac wywlaszczony, ale zaden inny nie wejdzie do tej metody, dopoki tamtej nieskonczy jej wykonywac? Tak jest?
A wiec co do przypadku z gory: jesli watek zostanie wywlaszczony w trakcie wykonywania metoda to inny watek nie bedzie mogl wejsc do metoda, ale nic nie bedzie stalo na przeszkodzie zeby z innego watku wywolac metoda2 skoro ona nie jest zsynchronizowana?
Mi sie wydawalo ze jak watek wchodzi do synchronizowanej metody to do poki jej nie opusci to zaden inny watek nie moze wlezc do innej synchronizowanej metody tego obiektu.
Nie, jeśli jeden wątek wejdzie do synchronizowanej metody (lub bloku), to żaden inny wątek nie może do niej wejść. Obiekty nie mają tutaj znaczenia (oprócz tego, że służą jako locki, ale to inna kwestia). W podanym przez ciebie przykładzie, jeśli wątek A wejdzie do metoda()
, to żaden inny wątek nie może wejsc do tej metody, dopóki wątek A jej nie opuści w dowolny sposób (np. się wysypie, czy zwyczajnie skończy wykonywać metodę).
Natomiast nic nie broni innych wątków przed wejściem bezpośrednio do metoda2()
, bo nie jest ona synchronizowana.
Tak,
metoda oznaczona jako synchronized oznacza że