2010-02-22 81 views
7

如果您有一些代碼塊想要在退出和清理對象時阻止執行,是否可以使用鎖來阻止執行?Monitor.Enter會發生什麼,但沒有匹配的Monitor.Exit?

Monitor.TryEnter(cleanupLock, ref acquiredLock); 

TryEnter可以用來確保代碼不被執行,並且因爲它不會等待鎖定,所以不會出現死鎖。當它確定它是時間爲關斷

另一個線程會抓住該鎖。

Monitor.Enter(cleanupLock); 

如果清除線程永遠不會調用

Monitor.Exit(cleanupLock); 

將這項事業的一個問題?

回答

8

是的,不要致電Monitor.Exit取得成功Monitor.TryEnterMonitor.Enter是應用程序中死鎖的快速通道。您可以得到它在非常有限工作方案,但最終的代碼或情形會改變,這將回來咬你。只是不要這樣做。

+0

違背傳統用法是反對這種模式的一個很好的論點。 –

6

唯一的「問題」將是沒有其他的代碼將永遠能夠AQUIRE在cleanupLock變量的鎖。

這可能會或可能不會是一個問題 - 但是,它是一種監視的濫用,所以我會避免這樣做。國際海事組織以更常見的方式處理這種情況會更好。

0

會這會帶來問題?

是的。鎖永遠不會被釋放。

Source

調用線程必須擁有對obj參數鎖。如果調用線程擁有指定對象的鎖定,並且已經爲對象創建了相同數量的Exit和Enter調用,則鎖定將被釋放。如果調用線程沒有像Enter一樣多次調用Exit,則鎖定不會被釋放。

1

如果這是一個清理關閉序列,那麼它或多或少就OK了。你冒着有人在某個地方檢查的風險,等待收購cleanupLock。它可以隱藏到代碼中,並在最令人尷尬的時刻出現。結果將是一個拒絕關閉的線程,可能會使進程保持活躍狀態​​。但是,在一天結束時,您將使用任何其他方法(例如全局關閉標誌)來運行相同的風險。

相關問題