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

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

相关推荐
肆悟先生4 小时前
3.18 constexpr函数
开发语言·c++·算法
SimonKing4 小时前
基于Netty的WebSocket自动解决拆包粘包问题
java·后端·程序员
程序员欣宸4 小时前
LangChain4j实战之十四:函数调用,高级API版本
java·ai·langchain4j
别在内卷了4 小时前
三步搞定:双指针归并法求两个有序数组的中位数(Java 实现)
java·开发语言·学习·算法
人工干智能4 小时前
python的高级技巧:Pandas中的`iloc[]`和`loc[]`
开发语言·python·pandas
wjs20244 小时前
Chart.js 混合图:深入解析与实战指南
开发语言
码头整点薯条4 小时前
License 集成 Spring Gateway:解决 WebFlux 非阻塞与 Spring MVC Servlet 阻塞兼容问题
java·spring
bing.shao4 小时前
基于 Go + Ollama 开发智能日志分析工具完整实战
开发语言·后端·golang
白露与泡影4 小时前
Spring 的西西弗斯之石:理解 BeanFactory、FactoryBean 与 ObjectFactory
java·后端·spring
忧郁的Mr.Li4 小时前
Spring+Mybatis配置自定义线程事务管理
java·spring·mybatis