C#中的死鎖和解決方案


https://blog.csdn.net/weixin_44228698/article/details/108672903

C#中的死鎖和解決方案

  1. 在多任務系統下,當一個或多個進程等待系統資源,而資源又被進程本身或其它進程占用時,就形成了死鎖。總的來說,就是兩個線程,都需要獲取對方鎖占有的鎖,才能夠接着往下執行,但是這兩個線程互不相讓,你等我先釋放,我也等你先釋放,但誰都不肯先放,就一直在這僵持住了。
  2. 死鎖的演示
        static void Main(string[] args) { Task.Run(()=> Method1()); Task.Run(() => Method2()); Console.Read(); } static void Method1() { lock (obj1) { Console.WriteLine("開始執行方法一"); Thread.Sleep(1000); lock (obj2) { Console.WriteLine("方法一執行完畢"); } } } static void Method2() { lock (obj2) { Console.WriteLine("開始執行方法二"); Thread.Sleep(1000); lock (obj1) { Console.WriteLine("方法二執行完畢"); } } }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

結果如下,這兩個方法永遠都不會執行完畢
在這里插入圖片描述
3.那么,死鎖應該怎么樣解決呢?

  • 首先,應該盡量避免大量嵌套的鎖的使用,這也是預防為主,當然也有信號量也可能會造成死鎖,這樣的話只能靠程序員自身注意去避免了。
  • 如果需要使用嵌套鎖,可以使用鎖的超時機制來避免對資源的長時間占用,演示如下:
        private static readonly object obj1 = new object(); private static readonly object obj2 = new object(); static void Main(string[] args) { Task.Run(()=> Method1()); Task.Run(() => Method2()); Console.Read(); } static void Method1() { try { if (Monitor.TryEnter(obj1, 5000)) { Console.WriteLine("開始執行方法一"); Thread.Sleep(1000); bool locked = false; try { Monitor.TryEnter(obj2, 5000, ref locked); Console.WriteLine("方法一執行完畢"); } finally { if (locked) { Monitor.Exit(obj2); } } } } finally { Monitor.Exit(obj1); } } static void Method2() { try { if (Monitor.TryEnter(obj2, 5000)) { Console.WriteLine("開始執行方法二"); Thread.Sleep(1000); bool locked=false; try { Monitor.TryEnter(obj1, 5000,ref locked); Console.WriteLine("方法二執行完畢"); } finally { if (locked) { Monitor.Exit(obj1); } } } } finally { Monitor.Exit(obj2); } }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63

在這里插入圖片描述
這樣,即使在兩個線程都在互相等待資源的情況下,利用超時機制,依然能夠使他們放棄當前鎖,保證解決死鎖問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM