Ce este un monitor, un mutex și un semaphore sunt aceleași lucruri sau lucruri diferite în stivă în rusă

Doar peste tot este scris diferit. Și nu înțeleg în nici un fel ce înseamnă în esență fiecare dintre aceste concepte. De exemplu, același Eckel are astfel de linii:







Pentru a rezolva problema rivalității fluxului, practic toate schemele cu mai multe fire sincronizează accesul la resursele partajate. Aceasta înseamnă că un singur fir poate accesa o resursă partajată la un moment dat. Cel mai adesea, acest lucru se face plasând fragmentul de cod în secțiunea de blocare, astfel încât numai un fir poate trece prin acest fragment de cod la un moment dat. Deoarece o astfel de clauză de blocare dă efectul excluderii reciproce, acest mecanism este adesea numit Mutex (Excludere Mutuală).

În Java, există suport integrat pentru prevenirea conflictelor sub forma cuvântului sincronizat. Atunci când un fir dorește să efectueze o bucată de cod protejat de cuvântul sincronizat, acesta verifică dacă semaforul este disponibil, accesează semaforul, execută codul și eliberează semaforul.

M-am citit într-un singur articol (și mențineți în continuare această înțelegere) că mutex - acesta este un obiect care este asociat cu fiecare obiect în Java, și care poate lua două stări: ocupat și liber. Și pentru monitor în același articol, era scris că acesta este un mecanism special (de fapt - o bucată de cod), care, folosind un mutex reglementează accesul de fire la un anumit bloc de cod (adică, el este responsabil pentru capturarea de fire de resurse, și permite doar unul dintre fir (care captează mutex-ul) pentru a merge pe acest, monitor protejat, cod bloc, respectiv, alte fire de monitorizare nu permite să ia această resursă și acest bloc de cod, iar când firul iese din blocul de cod, monitorul eliberează mutex și permite alte fire pentru a intra în acest bloc de cod). Este o înțelegere corectă?







Și exact ce înseamnă aceste concepte în Java?

În general, putem presupune că mutexul este un caz special de semafor. Semaforul funcționează pur și simplu - are un anumit număr inițial - contorul. De fiecare dată când un fir "capturează" un semafor, acest număr scade cu unu. Dacă este zero sau mai mică decât zero, semaforul este blocat (adică, codul se oprește în momentul capturării semaforului). De fiecare dată când se eliberează un semafor, acest contor este incrementat cu unul. Și dacă el, atunci ar fi mai mare decât zero, atunci orice flux arbitrar, care „atârnă pe capturarea semaforului“, va trimite un semnal să se trezească și va fi capabil să-și continue activitatea (desigur, reducând din nou valoarea contorului).

Cel mai evident exemplu de semaphore este managerii de descărcare - adăugăm o mulțime de fișiere pentru descărcare, dar limităm numărul de descărcări simultane.

că un mutex este un obiect care este asociat cu fiecare obiect din Java și care poate lua două stări: ocupat și gratuit.

este aproape de adevăr. Da, în Java, clasa Object are un câmp de tip mutex. Și toți moștenitorii (citiți toate celelalte clase) primesc de asemenea un mutex personal. dacă metoda este marcată cu cuvântul sincronizat, pur și simplu își înfășoară apelul în acest mutex. Asta este, dacă numiți metode sincronizate pe un obiect din fire diferite - mutexul nu le va lăsa să ruleze în paralel. Dar pentru obiecte diferite (chiar și pentru un singur tip) acest lucru nu mai funcționează.







Articole similare

Trimiteți-le prietenilor: