1. Hvorfor låse, og hva er låst?
Når vi bruker tråder, er den mest effektive måten selvfølgelig asynkron, det vil si at hver tråd kjører samtidig, uten å være avhengige av hverandre og vente. Men når ulike tråder trenger tilgang til en viss ressurs, kreves en synkroniseringsmekanisme, det vil si at når man leser og skriver samme ressurs, må ressursen kun opereres av én tråd samtidig for å sikre at hver operasjon er effektiv og umiddelbar, det vil si for å sikre atomiciteten i dens operasjon. lock er den mest brukte synkroniseringsmetoden i C#, i formatet lock(objectA){codeB}.
lock(objectA){codeB} virker enkelt, men har faktisk tre betydninger, noe som er essensielt for å bruke det riktig: 1. Er objektA låst? Hvis ikke, låser jeg den, ellers venter jeg til objektA er frigitt. 2. Etter låsing kan ikke andre tråder kalle kodeB eller bruke objektA under utførelsen av kodeB. 3. Etter å ha kjørt kodeB, frigjør objektA, og kodeB kan nås av andre tråder.
2. Hva skjedde med låsen(denne)?
La oss se på et eksempel:
I t1-tråden kaller LockMe lock(this), det vil si c1 i hovedfunksjonen, og når lock(c1) kalles i hovedtråden, må den vente på at låseblokken i t1 skal utføres før den får tilgang til c1, det vil si at alle c1-relaterte operasjoner ikke kan fullføres, så vi ser at selv c1. DoNotLockMe() blir ikke utført.
|