当前位置: 首页 > news >正文

【 java 多线程】死锁的问题

📋 个人简介

  • 💖 作者简介:大家好,我是阿牛,全栈领域优质创作者。😜
  • 📝 个人主页:馆主阿牛🔥
  • 🎉 支持我:点赞👍+收藏⭐️+留言📝
  • 📣 系列专栏:java 小白到高手的蜕变🍁
  • 💬格言:要成为光,因为有怕黑的人!🔥
    请添加图片描述

目录

    • 📋 个人简介
  • 前言
    • 什么是线程的死锁
    • 案例
    • 怎么避免死锁问题
  • 结语

前言

死锁的问题·相信大家看的博文多了也很熟悉,本文将从案例入手,介绍一下死锁。

什么是线程的死锁

  • 不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放自己需要的同步资源,就形成了线程的死锁。
  • 出现死锁后,不会出现异常,不会出现提示,只是所有的线程都处阻塞状态。

案例

package 死锁;

public class Deadlock {
    public static void main(String[] args) {
        String s1 = new String("我是s1");
        String s2 = new String("我是s2");
        // 线程一
        new Thread(){
            @Override
            public void run() {
                synchronized (s1){ // 锁s1
                    try {
                        sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(s1.toString());
                    synchronized (s2){ // 锁s2
                        System.out.println(s2.toString());
                    }

                }
            }
        }.start();

        // 线程二
        new Thread(){
            @Override
            public void run() {
                synchronized (s2){ // 锁s2
                    try {
                        sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(s2);
                    synchronized (s1){ // 锁s1
                        System.out.println(s1);
                    }

                }
            }
        }.start();

    }
}

在这里插入图片描述

这个案例就是一个典型的死锁问题,当线程一占用锁s1和线程二占用锁s2后,他们都需要往下执行,但线程一向下执行需要锁s2,而s2被线程二占用;同理,线程二向下执行需要锁s1,而s1被线程一占用。这就形成了死锁。
可以看运行结果图,不会出现异常,不会出现提示,只是所有的线程都处阻塞状态。

怎么避免死锁问题

  • 专门的算法、原则。
  • 尽量减少同步资源的定义。
  • 尽量避免嵌套同步。

结语

如果你觉得博主写的还不错的话,可以关注一下当前专栏,博主会更完这个系列的哦!也欢迎订阅博主的其他好的专栏。

🏰系列专栏
👉软磨 css
👉硬泡 javascript
👉flask框架快速入门

相关文章:

  • 全网都在说一个错误的结论
  • 免杀实战之面向PHP的WebShell免杀
  • LeetCode刷题复盘笔记—一文搞懂有序数组/链表转成二叉搜索树 二叉搜索树变平衡
  • Leetcode257. 二叉树的所有路径 Binary Tree Paths - Python递归法/回溯法
  • 【操作系统篇】第二篇——计算机系统概述(下)
  • 一箭双雕!刷完阿里 P8 架构师 spring 学习笔记 + 源码剖析,涨薪 8K
  • 【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
  • 汇编语言相关习题
  • Java(二):IDEA使用教程
  • Codeforces Round #826 (Div. 3) E,F
  • MPLS 虚拟专用网络 配置实验
  • AppCode 2022Improves compatibility
  • 【 java 多线程】同步锁 (Lock) 解决线程的安全问题
  • 计算机学院第三周语法组及算法组作业
  • Java数据结构 | 二叉树的基本操作
  • [iOS]Core Data浅析一 -- 启用Core Data
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • 77. Combinations
  • CentOS7简单部署NFS
  • ES10 特性的完整指南
  • EventListener原理
  • Fastjson的基本使用方法大全
  • HashMap ConcurrentHashMap
  • Javascript Math对象和Date对象常用方法详解
  • JavaScript学习总结——原型
  • java中具有继承关系的类及其对象初始化顺序
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • Vue 2.3、2.4 知识点小结
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 爱情 北京女病人
  • - 概述 - 《设计模式(极简c++版)》
  • 技术发展面试
  • 力扣(LeetCode)21
  • 前端面试之闭包
  • 前端性能优化——回流与重绘
  • 温故知新之javascript面向对象
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • 选择阿里云数据库HBase版十大理由
  • 昨天1024程序员节,我故意写了个死循环~
  • ​Java并发新构件之Exchanger
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • # 计算机视觉入门
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • (2)(2.10) LTM telemetry
  • (二十三)Flask之高频面试点
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (三)docker:Dockerfile构建容器运行jar包
  • (一)为什么要选择C++
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?