今天在園子裡面有園友反饋關於[c#基礎]說說lock到底鎖誰?文章中lock(this)的問題。後來針對文章中的例子,仔細想了一下,確實不準確,才有了這篇文章的補充,已經對文章中的demo進行修改。
乙個例子
using測試system;
using
system.collections.generic;
using
system.linq;
using
system.text;
using
system.threading;
using
system.threading.tasks;
namespace
locktest
); th.start();
thread.sleep(
1000
); thread th2 = new thread(() =>
});th2.start();
console.read();}}
class
testlock
console.writeline(i.tostring());
i++;}}
console.writeline(
"lock dispose");
}public
void
mothercallyoudinner()}}
那麼通過lock(static object)方式呢,能不能保證lock塊內的方法,同時只被乙個執行緒執行呢,並且執行緒2能訪問到mothercallyoudinner方法。而不像上面出現的那種情況,如果不釋放lock(this),導致執行緒2都無法執行**邏輯。
using測試system;
using
system.collections.generic;
using
system.linq;
using
system.text;
using
system.threading;
using
system.threading.tasks;
namespace
locktest
); th.start();
thread.sleep(
1000
); thread th2 = new thread(() =>
});th2.start();
console.read();}}
class
testlock
console.writeline(i.tostring());
i++;}}
console.writeline(
"lock dispose");
}public
void
mothercallyoudinner()}}
可以看到,將lock(this)更換為鎖定私有的靜態物件,執行緒2執行了,首先輸出了「your mother call you to home for dinner.」,同時實現了doworkwithlock方法中lock的**塊當前只被乙個執行緒執行,直到lcok(objlock)被釋放。因為鎖定的物件,外部不能訪問,執行緒2不再關心lock(this)是不是已經釋放,都會執行,當然也保證了方法doworkwithlock同時被乙個執行緒訪問。
1、避免使用lock(this),因為無法保證你提供的方法,在外部類中使用的時候,開發人員會不會鎖定當前物件。
通常,應避免鎖定public型別,否則例項將超出**的控制範圍。常見的結構 lock (this)、lock (typeof (mytype)) 和 lock ("mylock") 違反此準則:這裡只是說明lock(this)的問題,雖然極端。但開發中,不能保證不會發生。最佳做法是定義private物件來鎖定, 或private static物件變數來保護所有例項所共有的資料。
2、最好使用私有的靜態唯讀的鎖物件,保證不會影響其他邏輯的正常執行。
3、盡量避免死鎖的發生。
why is lock(this) bad?
C 基礎 說說lock到底鎖誰?
最近乙個月一直在弄檔案傳輸元件,其中用到多執行緒的技術,但有的地方確實需要只能有乙個執行緒來操作,如何才能保證只有乙個執行緒呢?首先想到的就是鎖的概念,最近在我們專案組中聽的最多的也是鎖誰,如何鎖?看到有同事使用lock this 也有lock private static object 那就有點困...
說說lock到底鎖誰 I ?
最近乙個月一直在弄檔案傳輸元件,其中用到多執行緒的技術,但有的地方確實需要只能有乙個執行緒來操作,如何才能保證只有乙個執行緒呢?首先想到的就是鎖的概念,最近在我們專案組中聽的最多的也是鎖誰,如何鎖?看到有同事使用lock this 也有lock private static object 那就有點困...
C 執行緒Lock鎖 只能鎖定物件
一.為什麼要lock,lock了什麼?當我們使用執行緒的時候,效率最高的方式當然是非同步,即各個執行緒同時執行,其間不相互依賴和等待。但當不同的執行緒都需要訪問某個資源的時候,就需要同步 機制了,也就是說當對同乙個資源進行讀寫的時候,我們要使該資源在同一時刻只能被乙個執行緒操作,以確保每個操作都是有...