C# 5.0 与 .Net 4.5 学习(二)Deadlocks死锁

Deadlocks死锁

过多使用锁同样可能出现问题。死锁中,至少有两个线程停止等待对方释放锁,因为都在等待对方而发生死锁,线程们进入无休止的等待。

为了说明死锁,下面的代码通过SampleTask累的构造函数实例化了两个StateObject类型的对象,两个任务被创建:一个task运行Deadlock方法另一个运行Deadlock2:

var state1=new StateObject();

var state2=new StateObject();

new Task(new SampleTask(state1,state2).Deadlock1).Start();

new Task(new SampleTask(state1,state2).Deadlock2).Start();

现在Deadlock1和Deadlock2改变两个对象:s1和s2,所以生成两个锁。Deadlock1最先锁住s1然后锁住s2。Deadlock2先锁s2然后s1.现在,偶尔可能会发生Deadlock1获得对s1的锁,接下来,发生线程切换,Deadlock2开始运行并获得s2的锁。第二个线程开始等待s1的锁释放。由于它需要等待,线程调度器又调度给正在等待s2的锁释放的第一个线程。现在,两个线程都在等待,并且因为lock块未结束而不会释放各自的占有的锁。这是一个典型的死锁:

 

 public class SampleTask
    {

        public SampleTask(StateObject s1, StateObject s2)
        {
            this.s1 = s1;
            this.s2 = s2;
        }
        private StateObject s1;
        private StateObject s2;
        public void Deadlock1()
        {
            int i = 0;
            while (true)
            {
                lock (s1)
                {
                    lock (s2)
                    {
                        s1.ChangeState(1);
                        s2.ChangeState(i++);
                        Console.WriteLine("still running,{0}",i);
                    }
                }
            }
        }

        public void Deadlock2()
        {
            int i = 0;
            while (true)
            {
                lock (s2)
                {
                    lock (s1)
                    {
                        s1.ChangeState(1);
                        s2.ChangeState(i++);
                        Console.WriteLine("still running,{0}", i);
                    }
                }
            }
        }

    }

结果是,这个程序循环了若干次但很快无反应。信息”still running“只在console上输出了几次。当然,这个问题出现快慢依赖于你的系统配置,结果会不同。

用VS2013,你可以在debug模式下运行这个程序,单击“中断”按钮,打开并行任务窗口,这里,你可以看到线程有Deadlock(死锁)的状态

死锁问题并不总是像现在所展现的这么明显。一个线程锁住s1然后s2;另一个线程先锁s2再是s1。这种情况下,你仅仅需要改变顺序使得两个线程执行同样的锁顺序。然后,这些锁在一个方法里可能隐藏的很深。你可以通过一开始设计一个好的锁顺序避免这个问题,并定义锁超时,这个将在下部分进行说明。

 

 

ps:未完,内容是看英文版自己翻译的,非原创,勿喷。无聊中...

posted @ 2015-10-19 17:34  羊茶茶  阅读(486)  评论(0编辑  收藏  举报