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();
    }

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

相关推荐
RainCityLucky2 分钟前
Java Swing 自定义组件库分享(七)
java·笔记·后端
Fuyo_111913 分钟前
C++中的活字印刷术——模板·初阶
开发语言·c++·笔记
小白|14 分钟前
cmake:昇腾CANN构建系统完全指南
java·c++·算法
在角落发呆14 分钟前
跨越网络鸿沟:传统文件传输与现代内网穿透的奇妙交响
开发语言·php
Season45018 分钟前
C++之模板元编程(前置知识 constexpr)
开发语言·c++
weixin_5129761719 分钟前
Java 面试宝典 Beta5.0
java
AI玫瑰助手20 分钟前
Python运算符:比较运算符(等于不等等于大于小于)与返回值
android·开发语言·python
Ting-yu22 分钟前
Spring AI Alibaba零基础速成(5) ---- Memory(记忆)
java·人工智能·后端·spring
月落归舟25 分钟前
一文掌握Spring AOP:从入门到底层原理
java·后端·spring
QuZhengRong27 分钟前
【Luck-Report】缓存
java·前端·后端·vue·excel