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


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

    // 资源访问冲突

    1. class State
    2. {
    3. private Object _lock = new Object();
    4. private int state = 100;
    5. private void test()
    6. {
    7. if(100 == state)
    8. {
    9. Console.Write("state=" + state);
    10. }
    11. state++;
    12. }
    13. private void test2()
    14. {
    15. if (101 == state)
    16. {
    17. Console.Write("state=" + state);
    18. }
    19. state++;
    20. }
    21. public void ChangeState()
    22. {
    23. Thread h = new Thread(test);
    24. Thread v = new Thread(test2);
    25. // h.Start();
    26. // v.Start();
    27. // state=100state=100state=101state=100请按任意键继续. . .
    28. lock (_lock)
    29. {
    30. h.Start();
    31. v.Start();
    32. // state=100请按任意键继续. . .
    33. // state=100state=101请按任意键继续. . .
    34. }
    35. }
    36. }

    // 主程序

    1. class StateProgram
    2. {
    3. static void Main(string[] args)
    4. {
    5. State state = new State();
    6. for (int i = 0; i < 10; i++)
    7. {
    8. Thread t = new Thread(state.ChangeState);
    9. t.Start();
    10. }
    11. Thread.Sleep(1000);
    12. }
    13. }

    // 死锁

    1. class Deadlock
    2. {
    3. Object _lock = new Object();
    4. Object _lock2 = new Object();
    5. private int flag = 0;
    6. public void test()
    7. {
    8. lock (_lock)
    9. {
    10. Console.WriteLine("我拿到了锁1");
    11. lock (_lock2)
    12. {
    13. Console.WriteLine("我拿到了锁2");
    14. if(0 == flag)
    15. {
    16. Console.WriteLine("我是第一名");
    17. flag = 1;
    18. }
    19. else
    20. {
    21. Console.WriteLine("我是第二名");
    22. }
    23. }
    24. }
    25. }
    26. public void test2()
    27. {
    28. lock (_lock2)
    29. {
    30. Console.WriteLine("他拿到了锁2");
    31. lock (_lock)
    32. {
    33. Console.WriteLine("他拿到了锁1");
    34. if (0 == flag)
    35. {
    36. Console.WriteLine("他是第一名");
    37. flag = 1;
    38. }
    39. else
    40. {
    41. Console.WriteLine("他是第二名");
    42. }
    43. }
    44. }
    45. }
    46. }

    // 主程序

    1. Deadlock star = new Deadlock();
    2. Thread t1 = new Thread(star.test);
    3. Thread t2 = new Thread(star.test2);
    4. t1.Start();
    5. t2.Start();
    6. //我拿到了锁1
    7. //他拿到了锁2

    // 解决方案1:锁同步

    1. class Deadlock
    2. {
    3. Object _lock = new Object();
    4. Object _lock2 = new Object();
    5. private int flag = 0;
    6. public void test()
    7. {
    8. lock (_lock)
    9. {
    10. Console.WriteLine("我拿到了锁1");
    11. lock (_lock2)
    12. {
    13. Console.WriteLine("我拿到了锁2");
    14. if(0 == flag)
    15. {
    16. Console.WriteLine("我是第一名");
    17. flag = 1;
    18. }
    19. else
    20. {
    21. Console.WriteLine("我是第二名");
    22. }
    23. }
    24. }
    25. }
    26. public void test2()
    27. {
    28. lock (_lock)
    29. {
    30. Console.WriteLine("他拿到了锁2");
    31. lock (_lock2)
    32. {
    33. Console.WriteLine("他拿到了锁1");
    34. if (0 == flag)
    35. {
    36. Console.WriteLine("他是第一名");
    37. flag = 1;
    38. }
    39. else
    40. {
    41. Console.WriteLine("他是第二名");
    42. }
    43. }
    44. }
    45. }
    46. }

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

    // 解决方案2:做标签

    1. class Deadlock
    2. {
    3. Object _lock = new Object();
    4. Object _lock2 = new Object();
    5. private int flag = 0;
    6. private int _flag = 0;
    7. public void test()
    8. {
    9. if (0 == _flag)
    10. {
    11. lock (_lock)
    12. {
    13. Console.WriteLine("我拿到了锁1");
    14. lock (_lock2)
    15. {
    16. Console.WriteLine("我拿到了锁2");
    17. if (0 == flag)
    18. {
    19. Console.WriteLine("我是第一名");
    20. flag = 1;
    21. }
    22. else
    23. {
    24. Console.WriteLine("我是第二名");
    25. }
    26. }
    27. }
    28. }
    29. _flag = 1;
    30. }
    31. public void test2()
    32. {
    33. if(1 == _flag)
    34. {
    35. lock (_lock2)
    36. {
    37. Console.WriteLine("他拿到了锁2");
    38. lock (_lock)
    39. {
    40. Console.WriteLine("他拿到了锁1");
    41. if (0 == flag)
    42. {
    43. Console.WriteLine("他是第一名");
    44. flag = 1;
    45. }
    46. else
    47. {
    48. Console.WriteLine("他是第二名");
    49. }
    50. }
    51. }
    52. }
    53. }
    54. }
    1. Deadlock star = new Deadlock();
    2. Thread t1 = new Thread(star.test);
    3. Thread t2 = new Thread(star.test2);
    4. t1.Start();
    5. Thread.Sleep(1000);
    6. t2.Start();

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

  • 相关阅读:
    文章发布系统的设计与实现
    C++ Primer第16章——模版与泛型编程
    深度测评FL Studio性能,多年Fl Studio使用感受分享
    红日靶场五(vulnstack5)渗透分析
    基于SpringBoot+Mybatis+Layui实现的简单就业管理系统
    机械转码日记【22】stack,queue与priority_queue
    Java中如何执行多条shell/bat命令 2023年验证通过
    云计算-Linux-软链接与硬链接,获取命令帮助,系统运行级别,关机和重启
    饮用水中磷超标的解决方法
    Kubernetes-03-实践篇 Spring-cloud-kubernetes 自动引入 K8S的 ConfigMap 参数(参数引用 和 文件挂载)
  • 原文地址:https://blog.csdn.net/qq_57233919/article/details/132766473