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

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

相关推荐
敲代码的瓦龙14 分钟前
Jetpack?DataBinding!!!
android·java·开发语言·mysql·android-studio
斯维赤17 分钟前
Spring AI | 结构化输出 & 多模态 一篇讲透
java·后端
程序员清风20 分钟前
聊聊我的AI学习方法与思考!
java·后端·面试
AI深栈22 分钟前
第 14 章 · LangGraph4j 入门:AI Agent 什么时候该上状态图
java·人工智能
爱奥尼欧24 分钟前
【C++】map、set 的底层是什么?红黑树五条性质、插入旋转到模拟实现
开发语言·数据结构·c++
摇滚侠27 分钟前
《Spring Boot 3:高级与架构设计》第 2 章 IOC容器的高级机制 Environment 个人理解 4
java·spring boot·笔记·后端
zl_dfq28 分钟前
Java学习1 之 【核心机制、程序基础结构、I/O】
java
青山木37 分钟前
RocketMQ 入门到原理(六):可靠性全景
java·后端·中间件·架构·rocketmq