---ロックキー、マルチスレッドプログラミング学習シリーズ

コンセプト

、指定されたオブジェクトをロック文ブロックを実行して、ロックを解除ミューテックスのロック文を取得します。ロックを保持しながら、ロックのスレッドを保持していることを再度取得し、ロックを解除することができます。レリーズロックのロックおよび待機を得るために、他のスレッドを防ぎます。
ロックが配布され、バランスの取れた債務は、分散ロックとみなすことができる、唯一の例を適用します。

フォーム
  1. ロック(この)
  2. ロック(文字列)
  3. ロック(オブジェクト)
  4. ロック(staticObject)
テストコード:
class Program
{
     const string firstOrderId = "001";
     const string secondOrderId = "002";
     const string thirdOrderId = "003";

     static void Main()
     {
         test(LockType.LockThis);
         //test(LockType.LockString);
         //test(LockType.LockObject);
         //test(LockType.LockStaticObject);

         Console.ReadLine();
     }

     static void test(LockType lockType)
     {
         Console.ForegroundColor = ConsoleColor.Yellow;
         Console.WriteLine("------------测试相同订单------------");
         Console.ForegroundColor = ConsoleColor.White;
         OrderPay(firstOrderId, 1, lockType);
         OrderPay(firstOrderId, 2, lockType);
         OrderPay(firstOrderId, 3, lockType);
         Thread.Sleep(10000);

         Console.ForegroundColor = ConsoleColor.Yellow;
         Console.WriteLine("------------测试不同订单------------");
         Console.ForegroundColor = ConsoleColor.White;
         OrderPay(firstOrderId, 1, lockType);
         OrderPay(secondOrderId, 1, lockType);
         OrderPay(thirdOrderId, 1, lockType);
     }

     static void OrderPay(string orderId, int threadNo, LockType lockType)
     {
         new Thread(() => new Payment(orderId, threadNo).Pay(lockType)).Start();
         Thread.Sleep(10);
     }
 }
  public class Payment
  {
      private readonly string LockString;
      public readonly int ThreadNo;
      private readonly Object LockObj = new object();
      private static readonly Object StaticLockObj = new object();

      public Payment(string orderID, int threadNo)
      {
          LockString = orderID;
          ThreadNo = threadNo;
      }

      public void Pay(LockType lockType)
      {
          ShowMessage("等待锁资源");
          switch (lockType)
          {
              case LockType.LockThis:
                  lock (this)
                  {
                      showAction();
                  }
                  break;
              case LockType.LockString:
                  lock (LockString)
                  {
                      showAction();
                  }
                  break;
              case LockType.LockObject:
                  lock (LockObj)
                  {
                      showAction();
                  }
                  break;
              case LockType.LockStaticObject:
                  lock (StaticLockObj)
                  {
                      showAction();
                  }
                  break;
          }
          ShowMessage("释放锁");
      }

      private void showAction()
      {
          ShowMessage("进入锁并开始操作");
          Thread.Sleep(2000);
          ShowMessage("操作完成,完成时间为" + DateTime.Now);
      }

      private void ShowMessage(string message)
      {
          Console.WriteLine(String.Format("订单{0}的第{1}个线程 {2}", LockString, ThreadNo, message));
      }

  }

  public enum LockType
  {
      LockThis = 0,
      LockString = 1,
      LockObject = 2,
      LockStaticObject = 3
  }

ロック(この)結果:
ここに画像を挿入説明

これは、ロック(これは)も、現在のスレッドに加えて、我々のニーズを満たしていないとどんな効果が表示されない、通常のクラスの非静的非シングルトンである場合には、ロック(これを)見ることができます。

(文字列)の検索結果をロック:

ここに画像を挿入説明
比較結果からロック(LockString)、要件に適合しますが、文字列の存在のCRLメカニズムのための特別な文字列を指すように、ヒープメモリブロックを管理する文字列値と同じ文字列のための異なる変数に起因します。他のサービスと発注の同じ識別ID ID文字列の値によってもたらさ同じ事業展開を支払うために同様の紛争後のためになることがあり、これは、異なるサービス間でのスレッドの相互排他が発生します

ロック(オブジェクト)の結果:

ここに画像を挿入説明
これにより、オブジェクトのtypeof演算子を変更したり、反射、自然、ロック(本)などによって得られることができます

ロック(staticObject)結果:

ここに画像を挿入説明
ロック(StaticObject)は注文が相互に排他的なスレッドに同じ金額を達成するために、同じ方法で相互に排他的な異なるペンの注文を満たすことができません。

集計ときは、共有リソースへの同期アクセス、ロック特定のオブジェクトインスタンスのスレッド(例えば、プライベート読み取り専用オブジェクトbalanceLock =新しいオブジェクト ();) 又は他の独立したコードロックオブジェクトの一部インスタンスとしてではないようです。これは、デッドロックやロック競合につながる可能性として、別の共有リソースに同じロックオブジェクトのインスタンスを使用しないでください。具体的には、以下のオブジェクトを避けるためには、ロックオブジェクトとして使用されています

  • この(呼び出し側がロックとして使用することができます)。
  • タイプの例(typeof演算オペレータがを通じて取得又は反射することができます)。
  • 文字列の例として、(一時的に格納されていてもよい)のテキストを含む文字列。
公開された37元の記事 ウォンの賞賛3 ビュー6335

おすすめ

転載: blog.csdn.net/huan13479195089/article/details/88806010