Synchronizacja wątkôw.

0

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?

1

co to znaczy wywłaszczony ?

0

Przestanie byc wykonywany i czas procesora zostanie przekazany do innego watku

1

Ale z jakiej paki, wątek który wykonuje metode, jakąkolwiek może przestać być wykonywany inaczej niż

  • zakończy się (sam)
  • dostanie ubity (z zewnątrz)

Wątek wejdzie do metoda() wykona co tam ma zrobić wyjdzie i już. Nikt nie może go "wywłaszczyć"

1

@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.

1

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.

0

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?

0

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?

1

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.

1

Tak,
metoda oznaczona jako synchronized oznacza że

  • dostęp do tej metody jest atomowy, to znaczy że żaden inny wątek nie wejdzie do tej metody, dopóki inny, który wszedł do tej metody wcześniej, go nie opuści.
    e.g
    Watek1 wchodzi do metody B która jest synchronized, zaraz po nim, do metody B chce dostać się Watek2, Watek2 nie wejdzie do tej metody, dopóki Watek1 z niej nie wyjdzie. Oczywiście jeżeli powiedzmy metoda B wywoła inną metodę, np: A która nie jest synchornizowana, to oczywistością jest, że Watek2 może sie do niej dostać bez czekania (bo A nie jest synchronizowana).
  • dodatkowo wątek który wychodzi(kończy) oraz następny który wchodzi zawiązują** happens-before-relationship** - to znaczy, że Java gwarantuje Ci że każda zmiana wykonana przez wątek wychodzący będzie widziana przez ten wchodzący.
0

Java Concurrency in Practice czyli wspolbieznosc dla praktykow po polsku? Mam ale zaczalem od java podstawy i rozdzialu poswieconego wspolbieznosci a pozniej mam zamiar to przeczytac, ale dzieki za porade

0

Dostalem 2 odpowiedzi jedna nie druga tak i juz nic nie czaje, to w koncu blokada ktora zaklada watek po wejsciu do synchronizowanej metody zwiazana jest z obiektem czy nie ?

1

Fizycznie Lock jest trzymany na klasie albo obiekcie, czyli możesz zrobić

synchronized(obiekt){
}

i w takiej sytuacji lock jest pobierany z obiekt'u - ten lock jest tak naprawdę zwykłym licznikiem, co sprawia zresztą że locki w javie działają na zasadzie reentrancy lock

1 użytkowników online, w tym zalogowanych: 0, gości: 1