1. Hvorfor låse, og hvad er låst?
Når vi bruger tråde, er den mest effektive metode selvfølgelig asynkron, det vil sige, at hver tråd kører på samme tid, uden at være afhængig af hinanden og vente. Men når forskellige tråde har brug for adgang til en bestemt ressource, kræves en synkroniseringsmekanisme, det vil sige, når man læser og skriver den samme ressource, skal ressourcen kun opereres af én tråd ad gangen for at sikre, at hver operation er effektiv og umiddelbar, det vil sige at sikre atomiciteten af dens operation. lock er den mest anvendte synkroniseringsmetode i C#, i formatet lock(objectA){codeB}.
lock(objectA){codeB} virker simpel, men har faktisk tre betydninger, hvilket er essentielt for at bruge det korrekt: 1. Er objektA låst? Hvis ikke, låser jeg den, ellers venter jeg til objektA er frigivet. 2. Efter låsning kan andre tråde ikke kalde codeB eller bruge objektA under eksekveringen af codeB. 3. Efter at kodeB er eksekveret, frigiv objektA, og kodeB kan tilgås af andre tråde.
2. Hvad skete der med låsen(denne)?
Lad os se på et eksempel:
I t1-tråden kalder LockMe lock(this), altså c1 i hovedfunktionen, og når lock(c1) kaldes i hovedtråden, skal den vente på, at låseblokken i t1 er udført, før den kan tilgå c1, det vil sige, at alle c1-relaterede operationer ikke kan gennemføres, så vi ser, at selv c1. DoNotLockMe() udføres ikke.
|