為什麼 lock(objLock) 比 lock(this) 好 (Why is it better to lock(objLock) than lock(this))


問題描述

為什麼 lock(objLock) 比 lock(this) 好 (Why is it better to lock(objLock) than lock(this))

  

Possible Duplicates:   Why is lock(this) {...} bad?  


In C# it is common to use lock(objLock) where objLock is an object created simply for the purpose of locking.

Why is this preferable to lock(this)?  What are the negative implications of lock(this) other than taking a lock out on the class itself?

‑‑‑‑‑

參考解法

方法 1:

Because something else could lock the instance, then you'd have a deadlock.

If you lock on the object you've created specifically for that purpose, you know you're in complete control, and nothing else is going to lock on it unexpectedly.

方法 2:

If you lock anything public, then both the class and some other class can try to get a lock. It's easy enough to create a sync object, and always preferrable;

private syncLock = new Object();

(by miguelWinston SmithSteve Cooper)

參考文件

  1. Why is it better to lock(objLock) than lock(this) (CC BY‑SA 3.0/4.0)

#locking #C#






相關問題

C# / ASP.NET - Web 應用程序鎖定 (C# / ASP.NET - Web Application locking)

在程序文件夾中創建鎖定文件會導致異常 (Creating Lock file in Programs Folder causes exception)

我什麼時候會使用 AutoResetEvent 和 ManualResetEvent 而不是 Monitor.Wait()/Monitor.Pulse()? (When would I use AutoResetEvent and ManualResetEvent instead of Monitor.Wait()/Monitor.Pulse()?)

鎖定一個 JavaScript 函數 (Lock a JavaScript Function)

當只有一個線程寫入共享變量時,我需要鎖嗎? (Do I need a lock when only a single thread writes to a shared variable?)

為什麼 lock(objLock) 比 lock(this) 好 (Why is it better to lock(objLock) than lock(this))

雙重檢查鎖定的修復有什麼問題? (What's wrong with this fix for double checked locking?)

在表格行上調用 Dibs (Calling Dibs on a table row)

我怎樣才能優雅地寫 lock {}? (how can I write lock {} elegantly?)

Double Check Lock 不能在這個 java 代碼上工作? (Doubly Check Lock Dosen't work on this java code?)

LINQPad / LINQ To SQL - 簡單查詢僅在循環內執行時才會引發內存不足 (LINQPad / LINQ To SQL - Simple Query Throws Out of Memory Only When Executed Inside a Loop)

如何在 dynamoDB 中實現 50 次寫入的事務? (How can I implement a transaction of 50 writes in dynamoDB?)







留言討論