Java每日一练_模拟面试题1(死锁)

一、死锁的条件

死锁通常发生在两个或者更多的线程相互等待对方释放资源,从而导致它们都无法继续执行。死锁的条件通常被描述为四个必要条件,也就是互斥条件、不可剥夺条件、占有并等待条件和循环等待条件。

  1. 互斥条件:资源不能被共享,只能由一个线程使用。

  2. 不可剥夺条件:占有者不能强行剥夺资源,只能主动释放。

  3. 占有并等待条件:一个线程必须占有至少一个资源,并且等待获取其他资源。

  4. 循环等待条件:存在一个线程等待序列,其中的每个线程都占有至少一个资源并正在等待获取下一个线程所占有的资源。

下面是一个简单的Java代码示例,演示了如何创建一个死锁的情况:

java 复制代码
public class DeadlockExample {
    private static Object resource1 = new Object();
    private static Object resource2 = new Object();
 
    public static void main(String[] args) {
        Thread t1 = new Thread(new Runnable() {
            public void run() {
                synchronized (resource1) {
                    System.out.println(Thread.currentThread() + " locked resource1.");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (resource2) {
                        System.out.println(Thread.currentThread() + " locked resource2.");
                    }
                }
            }
        });
 
        Thread t2 = new Thread(new Runnable() {
            public void run() {
                synchronized (resource2) {
                    System.out.println(Thread.currentThread() + " locked resource2.");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (resource1) {
                        System.out.println(Thread.currentThread() + " locked resource1.");
                    }
                }
            }
        });
 
        t1.start();
        t2.start();
    }
}

二、如何解决死锁

相关推荐
紧跟先前的步伐15 分钟前
Go AI Agent 实战 03|Token、上下文窗口与模型调用成本
java·人工智能·golang
benchmark_cc28 分钟前
Python 量化系统如何设计统一的数据访问接口:从策略解耦到数据层架构
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
const_qiu41 分钟前
第四章 00:开篇 —— 从「会聊天」到「记得住、会干活、能协作」
java·开发语言·人工智能·python
Wang's Blog1 小时前
Java 项目实战: 交友项目 - 个人资料管理的更新接口实现与坑
java·开发语言·交友
Promising_GEO1 小时前
GEE实战02期:从卫星波段开始:利用 Sentinel-2 自己计算 NDVI
java·sentinel·遥感·空间分析
大文说跨境1 小时前
亚马逊多账号管理浏览器怎么选?云登/紫鸟/AdsPower 对比
java·前端·自动化
CoderYanger1 小时前
Java EE 进阶:4.Spring Web MVC 入门(第一弹)
java·开发语言·前端·spring·面试·java-ee·mvc
估值探索者1 小时前
【Python量化选股流水线 #04】选股器好不好用?「昨日候选→今日表现」回看验收
开发语言·python·股票数据·股票数据api接口
顽疲2 小时前
java springboot vue 养老系统源码详解:请假 care_leave 销假与床位停费日扣实践
java·vue.js·spring boot
XIAEE2 小时前
一个即时通讯项目是怎么长出来的:(Spring Boot 3 + Vue 3 微前端 + 悟空 IM + LiveKit)
java·spring