C#__资源访问冲突和死锁问题

    /// 线程的资源访问冲突:多个线程同时申请一个资源,造成读写错乱。
    /// 解决方案:上锁,lock{执行的程序段}:同一时刻,只允许一个线程访问该程序段。
    /// 死锁问题:
    /// 程序中的锁过多,某一线程需要多个锁资源,而某个资源被另一线程占用,另一个线程同样如此,(谁也不愿先释放资源)形成闭环,线程无法继续进行。
    /// 解决方案:使用调度算法,让某一个被占用的资源被线程释放或关闭某个线程。 

// 资源访问冲突

    class State
    {
        private Object _lock = new Object();
        private int state = 100;
        private void test()
        {
            if(100 == state)
            {
                Console.Write("state=" + state);
            }
            state++;
        }
        private void test2()
        {
            if (101 == state)
            {
                Console.Write("state=" + state);
            }
            state++;
        }

        public void ChangeState()
        {
            Thread h = new Thread(test);
            Thread v = new Thread(test2);

            // h.Start();
            // v.Start();
            // state=100state=100state=101state=100请按任意键继续. . .

            lock (_lock)
            {
                h.Start();
                v.Start();
                // state=100请按任意键继续. . .
                // state=100state=101请按任意键继续. . .
            }
        }
    }

// 主程序

    class StateProgram
    {
        static void Main(string[] args)
        {
            State state = new State();

            for (int i = 0; i < 10; i++)
            {
                Thread t = new Thread(state.ChangeState);
                t.Start();
            }
            Thread.Sleep(1000);
        }
    }

// 死锁

    class Deadlock
    {
        Object _lock = new Object();
        Object _lock2 = new Object();

        private int flag = 0;

        public void test()
        {
            lock (_lock)
            {
                Console.WriteLine("我拿到了锁1");
                lock (_lock2)
                {
                    Console.WriteLine("我拿到了锁2");
                    if(0 == flag)
                    {
                        Console.WriteLine("我是第一名");
                        flag = 1;
                    }
                    else
                    {
                        Console.WriteLine("我是第二名");
                    }
                }
            }
        }

        public void test2()
        {
            lock (_lock2)
            {
                Console.WriteLine("他拿到了锁2");
                lock (_lock)
                {
                    Console.WriteLine("他拿到了锁1");
                    if (0 == flag)
                    {
                        Console.WriteLine("他是第一名");
                        flag = 1;
                    }
                    else
                    {
                        Console.WriteLine("他是第二名");
                    }
                }
            }
        }
    }

// 主程序

            Deadlock star = new Deadlock();

            Thread t1 = new Thread(star.test);
            Thread t2 = new Thread(star.test2);

            t1.Start();
            t2.Start();
            //我拿到了锁1
            //他拿到了锁2

// 解决方案1:锁同步

    class Deadlock
    {
        Object _lock = new Object();
        Object _lock2 = new Object();

        private int flag = 0;

        public void test()
        {
            lock (_lock)
            {
                Console.WriteLine("我拿到了锁1");
                lock (_lock2)
                {
                    Console.WriteLine("我拿到了锁2");
                    if(0 == flag)
                    {
                        Console.WriteLine("我是第一名");
                        flag = 1;
                    }
                    else
                    {
                        Console.WriteLine("我是第二名");
                    }
                }
            }
        }

        public void test2()
        {
            lock (_lock)
            {
                Console.WriteLine("他拿到了锁2");
                lock (_lock2)
                {
                    Console.WriteLine("他拿到了锁1");
                    if (0 == flag)
                    {
                        Console.WriteLine("他是第一名");
                        flag = 1;
                    }
                    else
                    {
                        Console.WriteLine("他是第二名");
                    }
                }
            }
        }
    }

我拿到了锁1
我拿到了锁2
我是第一名
他拿到了锁2
他拿到了锁1
他是第二名
请按任意键继续. . . 

// 解决方案2:做标签

    class Deadlock
    {
        Object _lock = new Object();
        Object _lock2 = new Object();

        private int flag = 0;
        private int _flag = 0;

        public void test()
        {
            if (0 == _flag)
            {
                lock (_lock)
                {
                    Console.WriteLine("我拿到了锁1");
                    lock (_lock2)
                    {
                        Console.WriteLine("我拿到了锁2");
                        if (0 == flag)
                        {
                            Console.WriteLine("我是第一名");
                            flag = 1;
                        }
                        else
                        {
                            Console.WriteLine("我是第二名");
                        }
                    }
                }
            }
            _flag = 1;
        }

        public void test2()
        {
            if(1 == _flag)
            {
                lock (_lock2)
                {
                    Console.WriteLine("他拿到了锁2");
                    lock (_lock)
                    {
                        Console.WriteLine("他拿到了锁1");
                        if (0 == flag)
                        {
                            Console.WriteLine("他是第一名");
                            flag = 1;
                        }
                        else
                        {
                            Console.WriteLine("他是第二名");
                        }
                    }
                }
            }

        }
    }
            Deadlock star = new Deadlock();
            Thread t1 = new Thread(star.test);
            Thread t2 = new Thread(star.test2);

            t1.Start();
            Thread.Sleep(1000);
            t2.Start();

我拿到了锁1
我拿到了锁2
我是第一名
他拿到了锁2
他拿到了锁1
他是第二名
请按任意键继续. . .

你可能感兴趣的:(C#编程,c#)