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

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

相关推荐
‿hhh14 分钟前
微服务智慧交通管理平台 - 项目实现(结合Qoder搭建)
java·人工智能·机器学习·微服务·架构·需求分析·规格说明书
Eiceblue16 分钟前
将 Python 列表导出为 Excel 文件:一维、二维、字典列表
开发语言·python·excel·visual studio code
五岳7 小时前
分库分表数据源ShardingSphereDataSource的Connection元数据误用问题分析
java·mysql·爬坑
带刺的坐椅7 小时前
迈向 MCP 集群化:Solon AI (支持 Java8+)在解决 MCP 服务可扩展性上的探索与实践
java·ai·llm·solon·mcp
鼠爷ねずみ7 小时前
SpringCloud前后端整体开发流程-以及技术总结文章实时更新中
java·数据库·后端·spring·spring cloud
代码or搬砖8 小时前
String字符串
android·java·开发语言
leo__5208 小时前
基于两步成像算法的聚束模式SAR MATLAB实现
开发语言·算法·matlab
Macbethad9 小时前
自动化测试技术报告
开发语言·lua
不会画画的画师9 小时前
Go开发指南:io/ioutil包应用和迁移指南
开发语言·后端·golang