• java 多线程()—— 死锁


    在学习操作系统时,已经反复理解很多遍了,所以我们直接给出死锁的例子:

    一个经典的小品《不差钱》

     

    赵本山:“你先上菜再唱”

    小沈阳:“你不让我唱我就不给你上菜”

    这不就是经典的死锁吗。

    1. public class DeadLock {
    2. public static void main(String[] args) {
    3. ServerDinner serverDinner = new ServerDinner(); //上菜的权利只有一份,这很重要!
    4. CanSing canSing = new CanSing(); //唱歌的权利只有一份,这很重要!
    5. //赵本山:拥有让小沈阳唱歌的权利,还想要上菜
    6. ZhaoBenShan zhaoBenShan = new ZhaoBenShan(serverDinner,canSing);
    7. zhaoBenShan.start();
    8. //小沈阳:拿着上菜的权利,还想要唱歌的权利
    9. XiaoShenYang xiaoShenYang = new XiaoShenYang(serverDinner,canSing);
    10. xiaoShenYang.start();
    11. }
    12. }
    13. //上菜的权利
    14. class ServerDinner{ }
    15. //唱歌的权利
    16. class CanSing{}
    17. //小沈阳:拿着上菜的权利,还想要唱歌的权利
    18. class XiaoShenYang extends Thread{
    19. ServerDinner serverDinner;
    20. CanSing canSing;
    21. public XiaoShenYang(ServerDinner serverDinner,CanSing canSing){
    22. this.serverDinner = serverDinner;
    23. this.canSing = canSing;
    24. }
    25. @Override
    26. public void run() {
    27. synchronized (serverDinner){
    28. System.out.println("小沈阳:你不让我唱歌我就不给你上菜");
    29. try {
    30. Thread.sleep(1000);
    31. } catch (InterruptedException e) {
    32. e.printStackTrace();
    33. }
    34. synchronized (canSing){
    35. System.out.println("小沈阳:成功唱歌");
    36. }
    37. }
    38. }
    39. }
    40. //赵本山:拥有让小沈阳唱歌的权利,还想要上菜
    41. class ZhaoBenShan extends Thread{
    42. ServerDinner serverDinner;
    43. CanSing canSing;
    44. public ZhaoBenShan(ServerDinner serverDinner,CanSing canSing){
    45. this.serverDinner = serverDinner;
    46. this.canSing = canSing;
    47. }
    48. @Override
    49. public void run() {
    50. synchronized (canSing){
    51. System.out.println("赵本山:先上菜再唱歌");
    52. try {
    53. Thread.sleep(1000);
    54. } catch (InterruptedException e) {
    55. e.printStackTrace();
    56. }
    57. synchronized (serverDinner){
    58. System.out.println("赵本山:成功得到菜");
    59. }
    60. }
    61. }
    62. }

    运行结果: 

    注意,唱歌的权利和上菜的权利只能有一份。如果唱歌或者上菜的权利有两份,那么就不会产生死锁了。

    如何避免(不知道这里“避免”用的对不对哈)死锁?

    对于小沈阳,把 synchronized (canSing) 的代码段拿出来从 synchronized (serverDinner)中拿出来 。也就意味着让出上菜的权利之后,再去索要唱歌的权利。

     对于赵本山,同样的道理。先让出唱歌的权利,再索要上菜的权利。

    收获:

    在模拟Rip协议的项目中,自己处理完几个死锁问题,就彻底明白了如何分析,解决死锁。所以,光学习只有输入不行,必须有项目实战作为输出!

  • 相关阅读:
    TSINGSEE青犀省级高速公路视频上云联网方案:全面实现联网化、共享化、智能化
    pyhanlp安装教程
    nginx代理后如何获取用户真实访问的ip,以及访问耗时接口是nginx报504问题处理
    人工智能一种现代的方法 第四章 非经典搜索 上(局部搜索)
    【讲座笔记】基于 Apache Calcite 的多引擎指标管理最佳实践|CommunityOverCode Asia 2023 | 字节开源
    誉天在线项目~ElementPlus图片回显
    LeetCode每日一题——两数之和
    19.9 Boost Asio 同步字典传输
    阿里云-maven私服idea访问私服与组件上传
    linux安装Zookeeper3.5.7详解
  • 原文地址:https://blog.csdn.net/qq_44886213/article/details/127972988