Če posredujete tip vrednosti, bo ta zaklenjen, in naslednjič, ko se koda izvede tukaj, bo spet zabeležena, in ne bo isti objekt dvakrat, zato ga ni mogoče zakleniti
lock(x)
{ ...
}
Zaklep se dejansko izvede preko objekta Monitor:
Zgornje je ekvivalentno:
System.Object obj = (System.Object)x; System.Threading.Monitor.Enter(obj); poskusi
{ ...
} končno
{ System.Threading.Monitor.Exit(obj);
}
Nato, če citiram izvirne besede MSDN: Uporabite Monitor za zaklepanje objektov (torej referenčnih tipov), ne vrednostnih tipov. Ko predaš spremenljivko tipa avalue v Enter, je ta označena kot objekt. Če isto spremenljivko ponovno posredujete v Enter in je označena kot ločen objekt in nit se ne blokira. V tem primeru koda, ki naj bi jo Monitor varoval, ni zaščitena. Poleg tega, ko preneseš spremenljivko na Exit, se ustvari še en ločen objekt. Ker je objekt, poslan v Exit, drugačen od objekta, ki je bil poslan v Enter, Monitor sproži SynchronizationLockException. Za več informacij glejte konceptualno temo Monitorji. |