可能性の重複:私が見た「スレッドセーフ」のコード例の全てにおいて
Difference between lock(locker) and lock(variable_which_I_am_using)別々のオブジェクトでロックが実行されるのはなぜですか?
、彼らは別のダミーオブジェクトをロックします。問題のデータに対して直接ロックを実行するのはなぜですか?
可能性の重複:私が見た「スレッドセーフ」のコード例の全てにおいて
Difference between lock(locker) and lock(variable_which_I_am_using)別々のオブジェクトでロックが実行されるのはなぜですか?
、彼らは別のダミーオブジェクトをロックします。問題のデータに対して直接ロックを実行するのはなぜですか?
ダミーオブジェクトをロックすると、他の誰もそのオブジェクトをロックしていないことが保証されます。
データをロックして、同じデータが外部に見える場合、その保証は失われます。例:
public class MyObject
{
public void SharedMethod()
{
lock (this)
{
// Do stuff
}
}
}
class Program
{
static void Main(string[] args)
{
MyObject o = new MyObject();
lock (o)
{
new Thread(() =>
{
// Gets blocked 2s because of external lock
o.SharedMethod();
}).Start();
Thread.Sleep(2000);
}
}
}
Jeff Richter(CLR Via C#の著者)は、なぜこの記事のSafe Thread Synchronizationについて説明していますか?
具体的には、この記事では「なぜ偉大なアイデアがそれほど大きくないのか」というセクションがあなたの質問に答えています。
実際にはCLR Via C#という本の章です。
要約すると、「synclock」オブジェクトとしてプライベートオブジェクトを使用すると、クラスがクラスに必要なロックをカプセル化して制御できます。したがって、クラスを使用するクライアントの数に関係なく、ロックは一貫して正しく実行されます。
大きな質問ですが、これも私の最初の考えでした。 – Russell
人々が探している答えを見つけやすくするために、この質問を閉じてはいけません。 @Bill、いわゆる正確な重複質問は、不自然な表題と言葉であり、この質問とは異なり基本的な質問を明確に述べていません。私は、この質問が検索で注目を集める可能性が高いと考えています。私は再開することを決意しました。 – Ash