簡體   English   中英

有關C#線程中的鎖的小查詢

[英]A small query about locks in c# threading

我看到很多使用靜態只讀對象的鎖定,在下面的給定代碼中此語句的意義是什么?我知道將鎖定應用於一個對象,這僅僅是使鎖定起作用的對象,只是一種hack,因為我不知道這里不需要任何對象,只需創建一個對象即可使鎖定起作用?

而且我不只是說對象obj1 = new object()我使用只讀和靜態,我猜測由於性能提高,但是只讀和靜態如何幫助提高性能?

static readonly object locker = new object();

代碼如下:

class ThreadSafe 
{
  static bool done;
  static readonly object locker = new object();

  static void Main()
  {
    new Thread (Go).Start();
    Go();
  }

  static void Go()
  {
    lock (locker)
    {
      if (!done) { Console.WriteLine ("Done"); done = true; }
    }
  }
}

建議使用單獨的私有對象而不是已經存在的全局可見對象來進行鎖定,因為其他代碼的鎖定決定有可能降低干擾您的私有鎖定方案的風險(這種問題很難證明,並且診斷;因此最好使它們變為不可能)。

如果該鎖對象提供了靜態類,或者您的意圖是在應用程序范圍內鎖定,則它必須是靜態的。 如果它僅用於鎖定單個對象實例,並且允許並發處理相同服務的類或類層次結構的其他對象,則它必須是實例對象。

在這種特定情況下,明確的只讀性不會對性能產生直接影響,但是在大多數其他情況下(主要是通過防止重新加載),它會直接影響性能,因此將所有只讀對象都這樣標記是一種有用的習慣。

擁有一個唯一目的是提供鎖的對象會稍微簡化事情。 為了防止外部代碼弄亂您的鎖並引起各種麻煩,您確實希望擁有一個僅對您可見的鎖。 完成此操作的最簡單方法是創建一個對象。 (如果您有另一個對象沒有其他人可以訪問的對象,則可以想象使用該對象……但是將鎖與其他所有對象分開通常會簡化概念。)

至於為什么它是靜態的……與其說是正確性,不如說是性能方面的東西。 為了鎖定靜態方法或同步對靜態資源的訪問,您需要一個屬於該類而不是實例的對象。 否則,每個實例都將鎖定自己的鎖,而不是共享一個鎖-除非只有一個實例,否則這將是毫無用處的,即使那時也是如此。 對於非靜態方法,除非出於某種原因要訪問靜態屬性或類似的東西,否則您不會使用static 如果您確實使用過它,並且不需要在實例之間同步訪問,那么最終將不必要地鎖定並拖慢了工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM