<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # “鎖定”語句(C# 參考) **lock** 關鍵字將語句塊標記為臨界區,方法是獲取給定對象的互斥鎖,執行語句,然后釋放該鎖。下面的示例包含一個 **lock** 語句。 ``` class Account { decimal balance; private Object thisLock = new Object(); public void Withdraw(decimal amount) { lock (thisLock) { if (amount > balance) { throw new Exception("Insufficient funds"); } balance -= amount; } } } ``` 有關更多信息,請參見 [線程同步(C# 和 Visual Basic)](https://msdn.microsoft.com/zh-CN/library/ms173179.aspx)。 ## 備注 **lock** 關鍵字可確保當一個線程位于代碼的臨界區時,另一個線程不會進入該臨界區。如果其他線程嘗試進入鎖定的代碼,則它將一直等待(即被阻止),直到該對象被釋放。 [線程處理(C# 和 Visual Basic)](https://msdn.microsoft.com/zh-CN/library/ms173178.aspx) 這節討論了線程處理。 **lock** 關鍵字在塊的開始處調用 [Enter](https://msdn.microsoft.com/zh-CN/library/de0542zz.aspx),而在塊的結尾處調用 [Exit](https://msdn.microsoft.com/zh-CN/library/system.threading.monitor.exit.aspx)。 [ThreadInterruptedException](https://msdn.microsoft.com/zh-CN/library/system.threading.threadinterruptedexception.aspx) 引發,如果 [Interrupt](https://msdn.microsoft.com/zh-CN/library/system.threading.thread.interrupt.aspx) 中斷等待輸入 **lock** 語句的線程。 通常,應避免鎖定 **public** 類型,否則實例將超出代碼的控制范圍。常見的結構 lock (this)、lock (typeof (MyType)) 和 lock ("myLock") 違反此準則: * 如果實例可以被公共訪問,將出現 lock (this) 問題。 * 如果 MyType 可以被公共訪問,將出現 lock (typeof (MyType)) 問題。 * 由于進程中使用同一字符串的任何其他代碼都將共享同一個鎖,所以出現 lock("myLock") 問題。 最佳做法是定義 **private** 對象來鎖定, 或 **private static** 對象變量來保護所有實例所共有的數據。 在 **lock** 語句的正文不能使用 [等待](https://msdn.microsoft.com/zh-CN/library/hh156528.aspx) 關鍵字。 下面演示在 C# 中使用未鎖定的線程的簡單示例。 ``` //using System.Threading; class ThreadTest { public void RunMe() { Console.WriteLine("RunMe called"); } static void Main() { ThreadTest b = new ThreadTest(); Thread t = new Thread(b.RunMe); t.Start(); } } // Output: RunMe called ``` 下例使用線程和 **lock**。只要 **lock** 語句存在,語句塊就是臨界區并且 balance 永遠不會是負數。 ``` // using System.Threading; class Account { private Object thisLock = new Object(); int balance; Random r = new Random(); public Account(int initial) { balance = initial; } int Withdraw(int amount) { // This condition never is true unless the lock statement // is commented out. if (balance < 0) { throw new Exception("Negative Balance"); } // Comment out the next line to see the effect of leaving out // the lock keyword. lock (thisLock) { if (balance >= amount) { Console.WriteLine("Balance before Withdrawal : " + balance); Console.WriteLine("Amount to Withdraw : -" + amount); balance = balance - amount; Console.WriteLine("Balance after Withdrawal : " + balance); return amount; } else { return 0; // transaction rejected } } } public void DoTransactions() { for (int i = 0; i < 100; i++) { Withdraw(r.Next(1, 100)); } } } class Test { static void Main() { Thread[] threads = new Thread[10]; Account acc = new Account(1000); for (int i = 0; i < 10; i++) { Thread t = new Thread(new ThreadStart(acc.DoTransactions)); threads[i] = t; } for (int i = 0; i < 10; i++) { threads[i].Start(); } } } ``` ## C# 語言規范 有關詳細信息,請參閱 [C# 語言規范](https://msdn.microsoft.com/zh-CN/library/ms228593.aspx)。該語言規范是 C# 語法和用法的權威資料。 ## 請參閱 [MethodImplAttributes](https://msdn.microsoft.com/zh-CN/library/system.reflection.methodimplattributes.aspx) [Mutex](https://msdn.microsoft.com/zh-CN/library/system.threading.mutex.aspx) [C# 參考](https://msdn.microsoft.com/zh-CN/library/618ayhy6.aspx) [C# 編程指南](https://msdn.microsoft.com/zh-CN/library/67ef8sbd.aspx) [線程處理(C# 和 Visual Basic)](https://msdn.microsoft.com/zh-CN/library/ms173178.aspx) [C# 關鍵字](https://msdn.microsoft.com/zh-CN/library/x53a06bb.aspx) [語句關鍵字(C# 參考)](https://msdn.microsoft.com/zh-CN/library/xt4z8b0f.aspx) [監視器](https://msdn.microsoft.com/zh-CN/library/hf5de04k.aspx) [Interlocked Operations](https://msdn.microsoft.com/zh-CN/library/sbhbke0y.aspx) [AutoResetEvent](https://msdn.microsoft.com/zh-CN/library/zd6a283y.aspx) [線程同步(C# 和 Visual Basic)](https://msdn.microsoft.com/zh-CN/library/ms173179.aspx)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看