1. Miksi lukita ja mikä on lukittu?
Kun käytämme säikeitä, tehokkain tapa on tietenkin asynkroninen, eli jokainen säie pyörii samaan aikaan ilman toisiinsa luottamista ja odottamista. Kuitenkin, kun eri säikeiden täytyy päästä tiettyyn resurssiin, tarvitaan synkronointimekanismi, eli kun luetaan ja kirjoitetaan samaa resurssia, resurssi tulee operoida vain yhdellä säikeellä samanaikaisesti, jotta jokainen operaatio on tehokas ja välitön, eli varmistetaan sen toiminnan atomisyys. lukko on yleisimmin käytetty synkronointimenetelmä C#:ssa, muodossa lock(objectA){codeB}.
lock(objectA){codeB} vaikuttaa yksinkertaiselta, mutta sillä on itse asiassa kolme merkitystä, mikä on olennaista sen asianmukaiseen käyttöön: 1. Onko objektiA lukittu? Jos ei, lukitsen sen, muuten odotan, että objekti A vapautuu. 2. Lukituksen jälkeen muut säikeet eivät voi kutsua codeB:tä tai käyttää objectA:ta codeB:n suorittamisen aikana. 3. CodeB:n suorittamisen jälkeen vapauta objectA ja codeB:hen pääsevät käsiksi muiden säikeiden kautta.
2. Mitä tapahtui lukitukselle (tälle)?
Katsotaanpa esimerkkiä:
t1-säikeessä LockMe kutsuu lock(this) eli c1:tä pääfunktiossa, ja kun kutsutaan lock(c1) pääsäikeessä, sen täytyy odottaa, että lock block t1:ssä suoritetaan ennen kuin pääsee c1:een, eli kaikkia c1:een liittyviä operaatioita ei voida suorittaa, joten näemme, että jopa c1. DoNotLockMe() ei suoriteta.
|