<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      代碼改變世界

      【C#|.NET】lock(this)其實是個坑

      2014-06-30 15:01  熬夜的蟲子  閱讀(30799)  評論(16)    收藏  舉報

        這里不考慮分布式或者多臺負載均衡的情況只考慮單臺機器,多臺服務器可以使用分布式鎖。出于線程安全的原因,很多種場景大家可能看代碼中看到lock的出現,尤其是在資金類的處理環節。 但是lock(this)真的達到你的需求了嗎?下面用實例來說明

        理論常識不多說,回到業務場景,舉個例子我們的需求一般就是在某個訂單進入某個安全優先級比較高的流程時要針對這筆訂單做到線程互斥。至于原因,這里再插一個概念,大部分orm在做更新操作時,實際上做的是全參數更新,所謂全參數更新,假如一個訂單表上有10個字段,我們只需要更新其中的一個金額字段,但是在傳統orm框架中實際上在訂單的實體類中賦值了所有字段而在更新操作中這些字段全部參與了更新,所以在高并發的場景下,如果有2個線程針對同一個訂單操作,并且沒有額外的保護程序(例如數據庫鎖、版本號等)那么在這種傳統框架下后一個線程更新可能就會覆蓋掉前一個線程的操作。因此lock的手段可以看成是一道保護墻。 那么接下來我們通過實例看一下lock4種不同方式(并非4種類別)之間的區別

        代碼很簡單 在結果截圖后直接附上

         1. Lock(this)

        

        可以看出lock(this),如果this是個普通的類非靜態非單例,那么lock(this)并不滿足我們的需求,甚至除了當前線程并看不出有任何作用。

        2. Lock(LockString)

        

         Lock(LockString) 從結果上來看比較契合要求,對于同一筆訂單做到的線程互斥,對于不同訂單即使用到了同一個類也不干擾。不過根據大家的回復意見LockString并不適合鎖。

        3. Lock(Object)

        

        Lock(Object)和Lock(this)一樣,因為根本原因2者方式是相同的。推薦!

        4. Lock(StaticObject)

        

        Lock(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
          }
      

        希望對大家有幫助。

      主站蜘蛛池模板: 中文字幕在线视频不卡一区二区| 精品人妻中文字幕av| 亚洲精品香蕉一区二区| 久久精品免视看国产成人| 国产亚洲精品久久久久5区| 久久久久久久久久久免费精品| 99精品国产一区二区三区2021| 东京热加勒比无码少妇| 熟女精品国产一区二区三区| 中文国产日韩欧美二视频| 国产99久久亚洲综合精品西瓜tv| 婷婷综合缴情亚洲| 日韩精品成人区中文字幕| 欧美深度肠交惨叫| 亚洲高清激情一区二区三区| 国产成人亚洲欧美二区综合| 亚洲精品综合一区二区三区| 中文字幕亚洲制服在线看| 好男人官网资源在线观看| 国产色a在线观看| 又粗又大又黄又硬又爽免费看| 日韩精品人妻黄色一级片| 免费a级毛片无码av| 亚洲熟女精品一区二区| 一本高清码二区三区不卡| 么公的好大好硬好深好爽视频| 亚洲国产精品成人av网| 狠狠综合久久综合88亚洲| 在线日韩日本国产亚洲| 双乳奶水饱满少妇呻吟免费看| 色成人亚洲| 人妻放荡乱h文| 亚洲精品国产美女久久久| 日本一区二区三区四区黄色| 亚洲成人动漫av在线| 免费无码av片在线观看播放| 亚洲精品欧美综合二区| 亚洲国产激情一区二区三区| 成人无号精品一区二区三区| 日韩人妻无码精品专区综合网| 色综合色国产热无码一|