【C#】ロック ~ 排他制御 ~

C# でのロック

 * データの不整合を防ぐ排他制御(exclusive operation)のためのロックの仕方は、C#では以下の通り。

【1】 lock ステートメント ... .NET4.0以降
【2】 Monitor.Enter() / Monitor.Exit() ... .NET4.0より前
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/lock-statement

■ 使用上の注意

 * デッドロックを起こさないようにすること

デッドロック とは?

 * 

【1】 lock ステートメント

 * シングルトーン(以下の関連記事を参照)のクラスを作成する時など排他制御が必要な場合に使用する

構文

lock(ロックするオブジェクト)
{
  // クリティカルセクション
}

サンプル

public class SingletonSampleClass
{
  private static SingletonSampleClass sampleObject;
  private static object lockObject = new object();

  public static SingletonSampleClass SampleInstance
  {
    get
    {
      lock (lockObject)
      {
          if (sampleObject == null)  
          {  
            sampleObject = new SingletonSampleClass();  
          }
          return sampleObject;
      }
    }
  }
}

【2】 Monitor.Enter() / Monitor.Exit()

サンプル

object lockObject = new object();
bool isLocking = false;
try
{
    System.Threading.Monitor.Enter(lockObject, ref isLocking);
    // Your code...
}
finally
{
  if (isLocking)
  {
    System.Threading.Monitor.Exit(lockObject);
  }
}