程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#中lock用法詳解

C#中lock用法詳解

編輯:C#入門知識

C#中lock用法詳解。本站提示廣大學習愛好者:(C#中lock用法詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是C#中lock用法詳解正文


本文實例講述了C#中lock的用法。分享給年夜家供年夜家參考。詳細剖析以下:

lock 症結字可以用來確保代碼塊完成運轉,而不會被其他線程中止。這是經由過程在代碼塊運轉時代為給定對象獲得互斥鎖來完成的。

先來看看履行進程,代碼示例以下:

lock 語句用於獲得某個給定對象的互斥鎖,履行一個語句,然後釋放該鎖。
lock-statement:(lock 語句:)
lock(expression) embedded-statement(lock   (   表達式   )   嵌入語句)
lock 語句的表達式必需表現一個援用類型的值。永久不會為 lock 語句中的表達式履行隱式裝箱轉換,是以,假如該表達式表現的是一個值類型的值,則會招致一個編譯時毛病。

以下情勢的 lock 語句:
lock (x) ...
(個中 x 是一個援用類型的表達式)完整等效於
system.threading.monitor.enter(x);
try {
   ...
}
finally {
   system.threading.monitor.exit(x);
}
分歧的只是:現實履行中 x 只盤算一次。
當一個互斥鎖已被占用時,在統一線程中履行的代碼仍可以獲得和釋放該鎖。然則,在其他線程中履行的代碼在該鎖被釋放前是沒法取得它的。

一個類的 system.type 對象可以便利地用來看成關於該類的靜態辦法的互斥鎖。例如:
class cache
{
   public static void add(object x) {
      lock (typeof(cache)) {
         ...
      }
   }
   public static void remove(object x) {
      lock (typeof(cache)) {
         ...
      }
   }
}
假定線程a先履行,線程b略微慢一點。線程a履行到lock語句,斷定obj能否已請求了互斥鎖,斷定根據是逐一與已存在的鎖停止object.referenceequals比擬(此處未加證明),假如不存在,則請求一個新的互斥鎖,這時候線程a進入lock外面了。
這時候假定線程b啟動了,而線程a還未履行完lock外面的代碼。線程b履行到lock語句,檢討到obj曾經請求了互斥鎖,因而期待;直到線程a履行終了,釋放互斥鎖,線程b能力請求新的互斥鎖並履行lock外面的代碼。

接上去說一些該lock甚麼對象。

為何不克不及lock值類型,好比lock(1)呢?lock實質上monitor.enter,monitor.enter會使值類型裝箱,每次lock的是裝箱後的對象。lock實際上是相似編譯器的語法糖,是以編譯器直接限制住不克不及lock值類型。

退一萬步說,就算能編譯器許可你lock(1),然則object.referenceequals(1,1)一直前往false(由於每次裝箱後都是分歧對象),也就是說每次都邑斷定成未請求互斥鎖,如許在統一時光,其余線程照樣可以或許拜訪外面的代碼,達不到同步的後果。同理lock((object)1)也不可。

那末lock("xxx")字符串呢?msdn上的原話是:

鎖定字符串特別風險,由於字符串被公共說話運轉庫 (clr)“暫留”。 這意味著全部法式中任何給定字符串都只要一個實例,就是這統一個對象表現了一切運轉的運用法式域的一切線程中的該文本。是以,只需在運用法式過程中的任何地位處具有雷同內容的字符串上放置了鎖,就將鎖定運用法式中該字符串的一切實例。

平日,最好防止鎖定 public 類型或鎖定不受運用法式掌握的對象實例。例如,假如該實例可以被地下拜訪,則 lock(this) 能夠會有成績,由於不受掌握的代碼也能夠會鎖定該對象。這能夠招致逝世鎖,即兩個或更多個線程期待釋放統一對象。出於異樣的緣由,鎖定公共數據類型(比擬於對象)也能夠招致成績。並且lock(this)只對以後對象有用,假如多個對象之間就達不到同步的後果。

lock(typeof(class))與鎖定字符串一樣,規模太廣了。

某些體系類供給專門用於鎖定的成員。例如,array 類型供給 syncroot。很多聚集類型也供給 syncroot。

而自界說類推舉用公有的只讀靜態對象,好比:
private static readonly object obj = new object();
為何要設置成只讀的呢?這時候由於假如在lock代碼段中轉變obj的值,其它線程就通順無阻了,由於互斥鎖的
對象變了,object.referenceequals必定前往false。

願望本文所述對年夜家的C#法式設計有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved