国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

lock與C#多線程

2019-11-14 13:32:39
字體:
來源:轉載
供稿:網友

lock與C#多線程

  lock 關鍵字將語句塊標記為臨界區,方法是獲取給定對象的互斥鎖,執行語句,然后釋放該鎖。簡單講就類似于 你去銀行辦理業務,一個柜臺一次只能操作以為客戶,而如果你要到這個柜臺辦理業務就必須等前面的人的業務完成,而彼此之間不會有交集。下面通過具體的代碼來深入說明:

using System;using System.Threading;namespace LockTest{    class PRogram    {        static void Main()        {            Test test = new Test();            Thread one = new Thread(test.ThreadOne);    //線程一調用test的 ThreadOne 方法            Thread two = new Thread(test.ThreadTwo);    //線程而調用test的 ThreadTwo 方法            one.Start();    //啟動線程一            two.Start();    //啟動線程二            Console.ReadKey();        }    }    class LockTest    {        public int Number { get; set; } = 10;        public void Print()        {            Console.WriteLine("The number is " + Number);        }    }    class Test    {        private readonly LockTest _lockTest = new LockTest();   //用于測試的對象        public void ThreadOne()        {            //在此方法內鎖定 _lockTest 所引用的對象并執行相應操作,在操作執行完以前不會釋放次對象            lock (_lockTest)            {                Console.WriteLine("The object has been locked!");                Thread.Sleep(5000);     //讓當前線程休眠 5s                _lockTest.Number = 200;                Console.Write("ThreadOne: ");                _lockTest.Print();            }            //操作完成并釋放對象            Console.WriteLine("The object has been released!");        }        public void ThreadTwo()        {
       //Console.WriteLine(_lockTest.Number); _lockTest.Number
= 100;
       //Console.WriteLine(_lockTest.Number);
//鎖定 _lockTest 所引用的對象 //如果要保證 lock 正常工作,所有對 _lockTest 的操作都要使用 lock 鎖定 //比如上面 _lockTest.Number=100; 在 lock 外面,那么它將不受約束(即可以強制訪問 _lockTest) //如果在上面語句后加 Console.WriteLine(_lockTest.Number); 那么將輸出 100 而不是 200 (也不是 10) lock (_lockTest) {
          //_lockTest.Number=100; Console.Write(
"ThreadTwo: "); _lockTest.Print(); } } }}

運行上面的代碼會發現在ThreadTwo 方法里的 lock內的代碼 時有明顯的延遲,即必須等到ThreadOne運行完成了才繼續執行 lock內部的代碼,而且輸出的結果是200而不是100,說明 lock 外面的代碼不會發生任何延遲。如果把 _lockTest.Number=100; 語句放在lock內部,會發現結果變成了 100 。

通過上面的例子可以看出要保證 lock 正確工作,要對每個 _lockTest 的操作加上 lock鎖定 。而在程序運行的時候,會根據線程訪問次對象的先后順序來為每個線程排序,且只有排在前面的線程對對象的操作完成了后面的對象才能訪問此對象。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 余干县| 西贡区| 葫芦岛市| 五峰| 九江县| 黔东| 会泽县| 子长县| 东明县| 专栏| 威海市| 体育| 牡丹江市| 徐闻县| 乌什县| 寿宁县| 洪湖市| 邹平县| 靖西县| 龙里县| 望奎县| 龙岩市| 高雄市| 慈利县| 揭东县| 临颍县| 五家渠市| 邵东县| 若羌县| 镇江市| 渝北区| 舟曲县| 通州区| 长治县| 乌拉特中旗| 佛冈县| 澜沧| 荣成市| 开平市| 镇赉县| 名山县|