• C#死锁案例代码


    C#死锁案例代码

    简介:

    如下代码实现创建两个线程t1和t2,分别起初分配占用lock1和ock2资源。当一个线程t1占用资源lock1时,再去请求另外一个资源lock2时,此时由于另外一个线程t2在正占用资源t2,请求失败,等待释放资源。同时t2又发出请求资源lock1,但是lock1又被t1占用,没有释放,也只能进行等待。此时两个线程只能等待一直等待对方释放资源,这就称之为死锁。

    namespace Deadlock
    {
        class DL
        {
            int field1 = 0;
            int field2 = 0;
            private object lock1 = new int[1];
            private object lock2 = new int[1];
    
            public void First(int val)
            {
                lock (lock1)
                {
                    Console.WriteLine("First: Acquired lock 1: "
                        + Thread.CurrentThread.GetHashCode() + " Now Sleeping.");
                    
                    //Try commenting Thread.Sleep()
                    Thread.Sleep(1000);//此时t2线程占用资源
    
                    Console.WriteLine("First: Acquired lock 1: "
                        + Thread.CurrentThread.GetHashCode() + " Now wants lock2.");
    
                    //当请求锁lock2时,lock被t2线程占用,等待释放
                    lock (lock2)
                    {
                        Console.WriteLine("First: Acquired lock 2: "
                            + Thread.CurrentThread.GetHashCode());
                        field1 = val;
                        field2 = val;
                    }
                }
            }
    
            public void Second(int val)
            {
                lock (lock2)
                {
                    Console.WriteLine("Second: Acquired lock 2: "
                        + Thread.CurrentThread.GetHashCode());
                    //当请求锁lock1时,lock1被t1线程占用,等待释放
                    lock (lock1)
                    {
                        Console.WriteLine("Second: Acquired lock 1: "
                            + Thread.CurrentThread.GetHashCode());
                        field1 = val;
                        field2 = val;
                    }
                }
            }
        }
    
        public class MainApp
        {
            DL d = new DL();
    
            public static void Main()
            {
                MainApp m = new MainApp();
                Thread t1 = new Thread(new ThreadStart(m.Run1));
                t1.Start();
                Thread t2 = new Thread(new ThreadStart(m.Run2));
                t2.Start();
                Console.ReadLine();
            }
    
            public void Run1()
            {
                this.d.First(10);
            }
    
            public void Run2()
            {
                this.d.Second(10);
            }
        }
    }

    技术的发展日新月异,随着时间推移,无法保证本博客所有内容的正确性。如有误导,请大家见谅,欢迎评论区指正!
    我创建了一个.NET开发交流群,用于分享学习心得和讨论相关技术难题。欢迎有兴趣的小伙伴扫码入群,相互学习!

  • 相关阅读:
    element-ui实现表格el-table展开行
    jQuery请求本地JSON文件,在谷歌浏览器运行时报跨域错误
    jQuery使用serialize获取form表单数据,中文乱码问题
    Element-ui局部添加loading效果
    Vue中this.$set的使用
    项目管理【81】 | 项目立项管理
    项目管理【80】 | 知识产权与标准规范-标准规范
    项目管理【79】 | 知识产权与标准规范-政府采购法法
    项目管理【78】 | 知识产权与标准规范-招投标法
    项目管理【77】 | 知识产权与标准规范-合同法
  • 原文地址:https://www.cnblogs.com/wml-it/p/14798281.html
Copyright © 2020-2023  润新知