各位好,
新手,剛入門C#,想請問下,如果兩個實體都要去控制同一個儀器,用哪種鎖可以實作啊!
uj5u.com熱心網友回復:
互斥,互斥,互斥uj5u.com熱心網友回復:
用比較“古老”的關于鎖的理論,是不同的代碼的段中要針對共享的物件加鎖。例如lock(localObj)和
{
.......代碼1
}
lock(localObj)先要保證將同一個物件作為 lock 信號量物件。
{
.......代碼2
}
不過這更適合“偶爾加鎖”的情況。傳統的說法,是認為lock(this){....}、lock{typeof(....)){......} 這類代碼容易濫用,容易造成死鎖。然而事情未必絕對,甚至隨著時代的不同,模式也會發生反轉。
當需要大量處理高并發、高性能、大資料的設計情況時,反而是要放棄過于“精細的”加鎖概念,而要使用擴大到“物件自身、型別”層面的封裝。例如:
public class X機
{
public X機(string id)
{
.....
}
public void 上傳資料()
{
lock(this)
{
................
}
}
public void 設定資料(valueType x)
{
lock(this)
{
..............
}
}
..............
這樣保證同一個物件的多個開放公共介面操作“自動加鎖”。對于基于異步 Task 的任務則可通過 SemaphoreSlim 機制編程。
uj5u.com熱心網友回復:
要注意,不是糾結什么“兩個實體之間”或者多少個、多少種代碼訪問同一個物件時的所謂“同步鎖”。而是以“面向物件封裝”的方式,讓物件自身暴露的公共介面方法保證是執行緒安全的。并且當你發現鎖過于“粗”的時候,可以通過減小物件封裝的顆粒度,提高并發程度。
由于“各種亂七八糟的代碼”都要求程式員去強行編程去 lock 同步,容易造成比較多的互鎖和缺失。而徹底放下“多個實體互鎖”的概念,你反而能夠輕松地保證多個實體高效編程和并發操作。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/254221.html
標籤:C#
