2013-04-08 13 views
-1

我們都知道下面的代碼是用來形成臨界區的。對象參數在Monitor.Enter調用中的作用.Net

public class CommonResource 
{ 
    public object obj = new object(); 

    public void PopularFunction() 
    { 
     lock (obj) 
     { 
      ///Access variable that we want to protect form being accessed concurrently 
      ///This forms critical section 
      ///My question is what is role'obj' plays in forming critical section. 
      ///How it works behind the scene. 
     } 

     ///Above code can be written as 

     Monitor.Enter(obj); 
     ///Access variable that we want to protect form being accessed concurrently 
     ///This forms critical section 
     ///My question is what is role'obj' plays in forming critical section. 
     ///How it works behind the scene. 
     Monitor.Exit(obj); 
    } 
} 

我的問題是Monitor.Enter如何在'obj'的幫助下形成一個關鍵部分。如果我們需要總是傳遞一個對象,爲什麼不能明確地傳遞任何對象。肯定有這個背後的原因。有人可以解釋嗎?

感謝, 與Hemant

+0

你的代碼不是使用lock或Monitor類的好例子。創建該類的多個實例會破壞線程安全。 'obj'應該是靜態的 – Jehof 2013-04-08 12:56:14

+1

有一個很好的免費電子書關於線程在這裏:['Albahari'](http://www.albahari.com/threading/) – 2013-04-08 12:56:28

+0

閱讀尼古拉斯提到的偉大資源,並注意你的'監視器'相當於'鎖定'不是很精確:http://www.albahari.com/threading/part2.aspx#_MonitorEnter_and_MonitorExit – GolfWolf 2013-04-08 12:58:18

回答

2

你傳遞一個對象作爲鎖的標識符使用。你看我有以下類:

public class LockTest 
{ 
    private object obj1 = new object(); 
    private object obj2 = new object(); 

    public void Method1() 
    { 
     lock(obj1) 
     { 
      ... 
     } 
    } 

    public void Method2() 
    { 
     lock(obj2) 
     { 
      ... 
     } 
    } 

    public void Method3() 
    { 
     lock(obj1) 
     { 
      ... 
     } 
    } 
} 

如果我打電話給Method1Method2從不同的線程,既不調用將阻止其他的,因爲他們是在不同的對象鎖定。但是,如果我要從不同的線程調用Method1Method3,則執行lock(obj1)的第一個線程將阻塞另一個線程的執行,直到在塊的末尾釋放鎖定爲止。

1

它用於框架知道鎖的scope

基本上,您要麼使用靜態對象,要麼使用非靜態對象。

public class Foo 
{ 
    private object sync = new object(); 
    public void Bar() 
    { 
     lock (this.sync) 
     { 
      // You can call new Foo().Bar() multiple times, because 
      // each Foo class lock its own instance of the sync object 
     } 
    } 
} 

public class Foo 
{ 
    private static object sync = new object(); 
    public void Bar() 
    { 
     lock (sync) 
     { 
      // You can't call new Foo().Bar() multiple times, because 
      // each Foo class lock the same instance of the sync object 
     } 
    } 
} 
相關問題