ロックオブジェクト[C#の.NET] [スレッド]スレッドを注意深く使用
私は複数のインスタンスをインスタンス化する場合、個人が異なる作業を行うことができなければなりません、私は時間のかかる作業のためのThreadPoolを使用すると仮定します。
public class DemoClass
{
private static object s_lock = new object();
private ulong m_value = 0;
public void DoWork(string name)
{
ThreadPool.QueueUserWorkItem(o =>
{
lock (s_lock)
{
for (ulong i = 0; i < 1000000; i++)
{
m_value = i;
Console.WriteLine(string.Format("{0} method value = {1}", name, m_value));
Thread.Sleep(1000);
}
}
});
}
}
クラスをインスタンス化
internal class Program
{
private static void Main(string[] args)
{
DemoClass c1 = new DemoClass();
DemoClass c2 = new DemoClass();
c1.DoWork("NO.1");
Thread.Sleep(1000);
c2.DoWork("NO.2");
Console.ReadKey();
}
}
次のようにプログラムのセクションの結果は以下のとおりです。
ロックされた静的変数の結果を使用して、大きく異なるインスタンスは、プログラマは、このクラスの非静的メソッド呼び出しを使用するときは常に問題となるオブジェクトを参照してロックされ、ロックが遭遇する、同期されます、これが私たちの目的を失いました
- 非静的メソッドを完了するには、マルチスレッド、十分に取り除か静的s_lock限り、異なる個体で自分の仕事を実行することができること。
- DoWorkが静的メソッドである場合は、静的メソッドは、ロックする静的オブジェクトを使用して、スレッドの安全性を確保するために、s_lockを変更する必要はありません。
s_lockは、静的な実行結果を削除します
エラーした場合、負担する彼を投稿初心者を通知してください
第4四半期の2010〜2017のC#
:元の大きな柱の スレッドのロックオブジェクト[C#の.NET] [スレッド]慎重に使用