在多線程開發的時候,lock和monitor是非常常用的東西。以前用的時候沒注意過區別。今天反編譯了一把,一下明白了,呵呵。
下面是lock的代碼:
lock(this)
{
...
}
它的IL代碼大致如下:
callvirt ...Monitor.Enter(object)
...
leave.s
....
callvirt ...Monitor.Exit(object)
呵呵,看到這裡就明白了,原來就是Monitor啊。繼續仔細比較了一下,又去msdn的論壇問了一下,發現上面的代碼其實就是下面的代碼:
try
{
Monitor.Exter(this);
...
}
finally
{
Monitor.Exit(this);
}
原來,lock就是放在了try_finally裡面的monitor啊。這樣看來,如果只是簡單的使用monitor,還是直接lock比較好,這樣一來代碼簡潔,二來可以避免忘記調用exit,或者因為出了異常而沒有調用exit的情況發生。