Skip to main content
 首页 » 编程设计

c#之死锁c#解决方案

2024年02月24日39Renyi-Fan

大家好,我正在提高我的多线程 C# 知识,想知道如何解决这个经典的死锁问题。

public class SomeClass 
{ 
    private object _lock1 = new object(); 
    private object _lock2 = new object(); 
 
 
    public void Method1() 
    { 
        lock (_lock1) 
        { 
            Thread.Sleep(10000); 
            lock (_lock2) 
            { 
                Thread.Sleep(10000); 
            } 
        } 
    } 
 
    public void Method2() 
    { 
        lock (_lock2) 
        { 
            Thread.Sleep(10000); 
            lock (_lock1) 
            { 
                Thread.Sleep(10000); 
            } 
        } 
    } 
} 

如果两个线程同时运行,则存在死锁的风险。

谢谢

请您参考如下方法:

  • 以一致的顺序上锁
  • 让你的锁尽可能细化
  • 尽可能使用不可变数据结构避免锁定
  • 使用 Monitor.TryEnter 而不是锁定(不会超时)