1. Miért zárnak, és mi a zárva?
Amikor szálakat használunk, a leghatékonyabb módszer természetesen aszinkron, vagyis minden szál egyszerre fut, anélkül, hogy egymásra támaszkodnánk és várakoznának. Azonban, amikor különböző szálaknak egy adott erőforráshoz kell hozzáférniük, szinkronizációs mechanizmusra van szükség, vagyis amikor ugyanazt az erőforrást olvassuk és írjuk, akkor az erőforrást egyszerre csak egy szál működteti, hogy minden művelet hatékony és azonnali legyen, vagyis biztosítsuk a működés atomiosságát. a lock a leggyakrabban használt szinkronizációs módszer a C#-ban, a lock(objectA){codeB} formátumban.
a lock(objectA){codeB} egyszerűnek tűnik, de valójában három jelentése van, ami elengedhetetlen a megfelelő használathoz: 1. A tárgy zárva van? Ha nem, akkor lezárom, különben várom, amíg az objektumA megjelenik. 2. Zárolás után más szálak nem hívhatják a codeB-t vagy használhatják az objektumA-t a codeB végrehajtása során. 3. A codeB végrehajtása után a release objectA, és a codeB más szálak is elérhetők.
2. Mi történt ezzel?
Nézzünk egy példát:
A t1 szálban a LockMe a lock(this) hívja, azaz c1-et a fő függvényben, és amikor a lock(c1) hívást hívja a fő szálban, várnia kell, hogy a t1-ben lévő lock block végrehajtásra kerüljön, mielőtt elérné a c1-et, vagyis minden c1-hez kapcsolódó művelet nem teljesíthető, így még c1-et is látunk. A DoNotLockMe() nem kerül végrehajtásra.
|