|
A lock kulcskulcsszavaként jelöl ki egy utasításblokkot kritikus zónaként azáltal, hogy egy adott objektumhoz mutexet vesz, végrehajtja az utasítást, majd feloldja a zárolást.
A lock utasítás alapvetően a Monitor.Enter és a Monitor.Exit funkciókat használja, vagyis a Monitor.Enter(this) akkor fut le, amikor a lock(this) végrehajtódik, és a Monitor.Exit(this) a göndör merevítő végén történik. Mi a jelentése? Bármely objektum esetében a memória első része az összes metódus címe, a második rész pedig index. Ő egy SyncBlockra mutat a CLR SyncBlock Cache területén. Mit jelent ez? Vagyis, amikor futtatod a Monitor.Enter (Objektum) programot, ha az objektum indexértéke negatív, válassz egy SyncBlockot a SyncBlock gyorsítótárból, és helyezd el a címét az objektum indexjébe. Ez befejezi az objektum által jelölt zárolót, és a többi szál újra végrehajtani akarja a Monitor.Enter (objektum) műveletet, amely pozitív objektummal indexet kap, majd vár. Amíg az index negatívvá nem válik, azaz a szál a Monitor.Exit(objektum) funkcióval negatívra változtatja az indexet. Amire figyelned kell a lock használatakor:
Az 1.lock nem tudja null értéket zárolni Egy objektum nullára mutathat, de nullat nem kell felszabadítani. (Lásd még: A teljes null megértése) A 2.lock nem tudja rögzíteni a húrtípust, bár az is referenciatípus. Mert a húrtípust a CLR "lehelte" Ez azt jelenti, hogy a teljes programban csak egy példányszám van egy adott stringből, és ugyanaz az objektum képviseli ezt a szöveget az összes futó alkalmazástartomány szálában. Ezért, amíg a zár egy azonos tartalommal rendelkező stringre kerül az alkalmazási folyamat bármely részén, az alkalmazásban minden ilyen sztrómos példánya zárolva lesz. Ezért a legjobb olyan magánszemélyeket vagy védett tagokat zárni le, akik nem maradnak fennmaradva. 3.locklock Az objektum egy programblokk memóriahatára 4. Az értéktípus nem zárható le, mert az előző szövegben piros színben van a "objektum szabadul", és az értéktípus nem referenciatípus Az 5.Lock elkerüli a nyilvános típusok vagy olyan objektumok zárását, amelyeket a program nem irányít. Például, ha az instance nyilvánosan elérhető, a lock(ez) problémás lehet, mert az ellenőrizetlen kód is lezárhatja az objektumot. Ez holtponthoz vezethet, amikor két vagy több szál vár ugyanazt az objektumot kiengedni. A nyilvános adattípusok (objektumok helyett) zárolása is okozhat problémákat ugyanezen okból. Lock(this) használatakor az osztálytag változó értéke megváltoztatható azzal a a metóddal, amely nem a kritikus zónában
Alkalmazási forgatókönyv: Gyakran használják arra, hogy megakadályozzák a nyilvános változók értékében kialakuló bizonyhatatlan kivételeket, amelyeket többszálas műveletek okoznak, a műveletek biztonságának biztosítása érdekében
|