C# 並發--鎖



///1. lock(this)的缺點就是在一個線程(例如本例的t1)通過執行該類的某個使用"lock(this)"的方法(例如本例的LockMe())鎖定某對象之后, 導致整個對象無法被其他線程(例如本例的主線程)訪問 - 因為很多人在其他線程(例如本例的主線程)中使用該類的時候會使用類似lock(c1)的代碼。

2. 鎖定的不僅僅是lock段里的代碼,鎖本身也是線程安全的。

3. 我們應該使用不影響其他操作的私有對象作為locker。

4. 在使用lock的時候,被lock的對象(locker)一定要是引用類型的,如果是值類型,將導致每次lock的時候都會將該對象裝箱為一個新的引用對象(事實上如果使用值類型,C#編譯器(3.5.30729.1)在編譯時就會給出一個錯誤)。


//鎖對象
private static readonly object LockObject = new object();


public static string GetNewCardID(string exhID)
{
string sql = string.Format("declare @VisitorCard varchar(10); exec [Spm_GetNextVisCard] {0},'NNNN','','',@VisitorCard output;select @VisitorCard ", exhID);

string VisitcardId = string.Empty;
//加鎖
lock (LockObject)
{
VisitcardId = SqlHelper.ExecuteScalar(sql);
}
if (string.IsNullOrEmpty(VisitcardId))
{
//鎖執行后依然有問題的話,那么允許失敗一次,失敗后延遲0.5秒再執行一次,如果再次失敗那么就報錯
System.Threading.Thread.Sleep(500);
VisitcardId = SqlHelper.ExecuteScalar(sql);
if (string.IsNullOrEmpty(VisitcardId))
{
CommonBasic.File.FileLog.WriteLog("卡號為空:", VisitcardId);
}
}

return VisitcardId;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM