Adatok szinkronizálása többszálú használatra
Ha több szál is indíthat hívásokat egyetlen objektum tulajdonságaira és metódusára, kritikus fontosságú, hogy ezek a hívások szinkronizálódjanak. Ellenkező esetben az egyik szál megszakíthatja a másik szál működését, és az objektum érvénytelen állapotban maradhat. Az osztályt, amelynek tagjai védettek az ilyen megszakításoktól, szálbiztosnak nevezzük.
A .NET számos stratégiát biztosít a példányokhoz és statikus tagokhoz való hozzáférés szinkronizálásához:
Szinkronizált kódrégiók. Az osztály vagy a Monitor fordító támogatásával csak az azt igénylő kódblokkot szinkronizálhatja, ami javítja a teljesítményt.
Manuális szinkronizálás. A .NET-osztálytár által biztosított szinkronizálási objektumokat használhatja. Lásd a szinkronizálási primitívek áttekintését, amely tartalmazza az Monitor osztály megvitatását.
Szinkronizált környezetek. Csak .NET-keretrendszer és Xamarin-alkalmazások esetén engedélyezheti az SynchronizationAttribute objektumok egyszerű, automatikus szinkronizálásátContextBoundObject.
Gyűjteményosztályok a System.Collections.Concurrent névtérben. Ezek az osztályok beépített szinkronizált hozzáadási és eltávolítási műveleteket biztosítanak. További információ: Thread-Széf Collections.
A közös nyelvi futtatókörnyezet olyan szálmodellt biztosít, amelyben az osztályok számos kategóriába sorolhatók, amelyek a követelményektől függően különböző módokon szinkronizálhatók. Az alábbi táblázat azt mutatja be, hogy az adott szinkronizálási kategóriához tartozó mezők és metódusok milyen szinkronizálási támogatást kapnak.
Kategória | Globális mezők | Statikus mezők | Statikus metódusok | Példánymezők | Példány metódusai | Adott kódblokkok |
---|---|---|---|---|---|---|
Nincs szinkronizálás | Nem | Nem | Nem | Nem | Nem | Nem |
Szinkronizált környezet | Nem | Nem | Nem | Igen | Igen | Nem |
Szinkronizált kódrégiók | Nem | Nem | Csak ha meg van jelölve | Nem | Csak ha meg van jelölve | Csak ha meg van jelölve |
Manuális szinkronizálás | Manuális | Manuális | Manuális | Manuális | Manuális | Manuális |
Nincs szinkronizálás
Ez az objektumok alapértelmezett értéke. Bármely szál bármikor hozzáférhet bármilyen metódushoz vagy mezőhöz. Ezeket az objektumokat egyszerre csak egy szál érheti el.
Manuális szinkronizálás
A .NET-osztálytár számos osztályt biztosít a szálak szinkronizálásához. Lásd a szinkronizálási primitívek áttekintését.
Szinkronizált kódterületek
Az osztály vagy a fordító kulcsszó használatával szinkronizálhatja a Monitor kódblokkokat, a példánymetodusokat és a statikus metódusokat. A szinkronizált statikus mezők nem támogatottak.
A Visual Basic és a C# egyaránt támogatja a kódblokkok megjelölését egy adott nyelvi kulcsszóval, a lock
C# utasítással vagy a SyncLock
Visual Basic utasításával. Amikor a kódot egy szál hajtja végre, a rendszer kísérletet tesz a zárolás beszerzésére. Ha a zárolást már beszerezte egy másik szál, a szál addig blokkolódik, amíg a zárolás elérhetővé nem válik. Amikor a szál kilép a szinkronizált kódblokkból, a zárolás felszabadul, függetlenül attól, hogy a szál hogyan lép ki a blokkból.
Feljegyzés
A C# 13-tól kezdődően az lock
utasítás felismeri, hogy a zárolt objektum egy példány System.Threading.Lock , és a EnterScope
módszerrel szinkronizált régiót hoz létre. A lock
, ha a cél nem példány Lock
, és SyncLock
az utasítások implementálva Monitor.Enter vannak, és Monitor.Exitígy más metódusok Monitor is használhatók velük együtt a szinkronizált régióban.
Egy metódust MethodImplAttribute olyan értékkel MethodImplOptions.Synchronizedis dekorálhat, amelynek ugyanolyan hatása van, mint a fordítói kulcsszavak egyikének használata Monitor a metódus teljes törzsének zárolásához.
Thread.Interrupt Segítségével a szálakat ki lehet szakítani a blokkolási műveletekből, például a kód szinkronizált régiójához való hozzáférésre való várakozásra. A Thread.Interrupt a szálak olyan műveletekből való megszakítására is használható, mint a Thread.Sleep.
Fontos
A metódusok (Shared
a Visual Basic metódusai) védelme static
érdekében ne zárolja a típust – azaz typeof(MyType)
C#-ban, GetType(MyType)
Visual Basicben vagy MyType::typeid
C++-ban. Ehelyett használjon privát statikus objektumot. Hasonlóképpen ne használja this
a C# (Me
Visual Basic)-ben a példány metódusának zárolására. Használjon inkább privát objektumot. Az osztályokat vagy példányokat nem a saját kóddal lehet zárolni, ami holtpontot vagy teljesítményproblémákat okozhat.
Fordító támogatása
A Visual Basic és a C# egyaránt támogat egy olyan nyelvi kulcsszót, amely az objektumot használja Monitor.Enter és Monitor.Exit zárolja. A Visual Basic támogatja a SyncLock utasítást; A C# támogatja a zárolási utasítást.
Mindkét esetben, ha a kódblokk kivételt eredményez, a zárolás vagy a SyncLock által beszerzett zárolás automatikusan ki lesz oldva. A C# és a Visual Basic fordítói végül letiltják/ a Figyelő.Enter parancsot a kipróbálás elején, a Monitor.Exit pedig a végső blokkban. Ha a zárolási vagy a SyncLock-blokkon belül kivétel történik, a végső kezelő fut, hogy elvégezhesse a tisztítási munkát.
Szinkronizált környezet
Csak .NET-keretrendszer- és Xamarin-alkalmazásokban az SynchronizationAttribute összes példány metódusát és mezőjét szinkronizálhatja bármelyikenContextBoundObject. Az ugyanabban a környezetben lévő tartomány összes objektuma ugyanazt a zárolást használja. Több szál is hozzáférhet a metódusokhoz és a mezőkhöz, de egyszerre csak egyetlen szál érhető el.
Lásd még
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: