Jei perduosite reikšmės tipą, jis bus įtrauktas į dėžutę, o kitą kartą, kai kodas bus paleistas čia, jis vėl bus dėžutėje ir nebus tas pats objektas du kartus, todėl jo negalima užrakinti
užraktas (x)
{ ...
}
Užraktas iš tikrųjų atliekamas per monitoriaus objektą:
Tai, kas išdėstyta pirmiau, prilygsta:
System.Object obj = (System.Object)x; System.Threading.Monitor.Enter(obj); Pabandykite
{ ...
} Pagaliau
{ System.Threading.Monitor.Exit(obj);
}
Tada cituoti originalius žodžius MSDN: Naudokite monitorių, jei norite užrakinti objektus (t. y. nuorodų tipus), o ne reikšmių tipus. Kai perduodate reikšmės tipo kintamąjį Enter, jis įrašomas į lauką kaip objektas. Jei vėl perduosite tą patį kintamąjį Enter, jis bus įrašytas į dėžutę kaip atskiras objektas, o gija neblokuoja. Tokiu atveju kodas, kurį "Monitor" tariamai apsaugo, nėra apsaugotas. Be to, kai perduodate kintamąjį išeiti, sukuriamas dar vienas atskiras objektas. Kadangi objektas, perduotas išeiti, skiriasi nuo objekto, perduoto Enter, monitorius pateikia SynchronizationLockException. Daugiau informacijos rasite konceptualioje temoje Monitoriai. |