java:多线程中的死锁

多线程:死锁

当多个线程互相争抢资源导致都在互相等待资源的僵局时,如果没有外力,将会一直僵持下去,这就是死锁.

就像两个人分一双筷子,如果一人拿到一根筷子,都在等待对方手里的那根,将没有人能完成吃饭的任务.

死锁的必要条件

1,互斥

即资源只能被一个线程调用

2,不可剥夺

资源已获得的资源不可被剥夺

3,请求和保持条件

资源请求资源时不会对自己的资源放手

4,循环等待

资源之间头尾相接等待资源

死锁场景演示

死锁出现的场景非常多,这里仅简单展示一下死锁的原理

java 复制代码
public static final Object source1 = new Object();
    public static final Object source2 = new Object();
    public static void main(String[] args) {
        new Thread(()->{
            while(true){
                synchronized (source1){
                    System.out.println(Thread.currentThread().getName()+"拿到了source1,正在等待source2");
                    synchronized (source2){
                        System.out.println(Thread.currentThread().getName()+"拿到了source1和source2,执行完毕");
                    }
                }
            }
        },"Thread1").start();
        new Thread(()->{
            while(true){
                synchronized (source2){
                    System.out.println(Thread.currentThread().getName()+"拿到了source2,正在等待source1");
                    synchronized (source1){
                        System.out.println(Thread.currentThread().getName()+"拿到了source1和source2,执行完毕");
                    }
                }
            }
        },"Thread2").start();
    }

由于锁的嵌套存在,两个资源都拥有互斥性,所以当两个资源被不同线程拿到并且线程都需要另一个资源来继续执行时,就会出现死锁.

相关推荐
w2sfot3 分钟前
【JS加密在线】jsjiami.online(让JavaScript 更安全!)
开发语言·javascript·安全
HSunR3 分钟前
ruoyi 若依 自定义注解 参数校验
java·前端·数据库
Wang's Blog21 分钟前
Java 项目部署之 Docker工具快速入门: Docker 是什么以及它如何解决部署环境问题
java·开发语言·docker
老木避暑研究所26 分钟前
从原始数据到洞察:一次完整的避暑房环境数据采集、清洗与可视化分析
java·开发语言
程序喵大人40 分钟前
【C++入门】编译链接模型 - 05 ODR 为什么会让重复定义变成工程炸点
开发语言·c++·编译链接·odr
weixin199701080161 小时前
《淘宝TOP API:落地方案、接口边界与业务踩坑 —— 聚石塔内外价差 10 倍的真相》(附 Python 源码)
开发语言·python
前端 贾公子1 小时前
LangGraph == 图的状态(State)管理 (上)
java·开发语言·数据库
huaweichenai1 小时前
spring boot 实现file文件上传
java·spring boot·后端
VX_bysjlw9851 小时前
数码设备销售网站设计与实现39138-计算机毕设原创(免费领源码+带部署教程)
java·vue.js·spring boot·mysql·tomcat·mybatis·idea
荣码2 小时前
从0到1搭一个生产级RAG系统:串联前面21篇所有知识
java·python