Java模拟死锁

synchronized实现

java 复制代码
package com.example.demo.dealock.synchronize;

/**
 * @author chenwei
 * @date 2025-12-17 17:02
 * @description
 */
public class DeadLockDemo {

    public final static Object lockA = new Object();
    public final static Object lockB = new Object();

    public static void main(String[] args){
        new Thread("死锁线程1"){
            @Override
            public void run() {
                synchronized (lockA){
                    System.out.println("Thread 1: Holding lock A...");
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("Thread 1: Waiting for lock B...");
                    synchronized (lockB){
                        System.out.println("Thread 1: Acquired lock B!");
                    }
                }
            }
        }.start();

        new Thread("死锁线程2"){
            @Override
            public void run() {
                synchronized (lockB){
                    System.out.println("Thread 2: Holding lock B...");
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("Thread 2: Waiting for lock A...");
                    synchronized (lockA){
                        System.out.println("Thread 2: Acquired lock A!");
                    }
                }
            }
        }.start();
    }
}

ReentrantLock实现

java 复制代码
package com.example.demo.dealock.reentrenlock;

import java.util.concurrent.locks.ReentrantLock;

/**
 * @author chenwei
 * @date 2025-12-17 17:14
 * @description
 */
public class DeadLockDemo {

    public final static ReentrantLock lockA = new ReentrantLock();
    public final static ReentrantLock lockB = new ReentrantLock();

    public static void main(String[] args){
        new Thread("死锁线程1"){
            @Override
            public void run() {
                lockA.lock();
                System.out.println("Thread 1: Holding lock A...");
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("Thread 1: Waiting for lock B...");
                {
                    lockB.lock();
                    System.out.println("Thread 1: Acquired lock B!");
                    lockB.unlock();
                }
                lockA.unlock();
            }
        }.start();

        new Thread("死锁线程2"){
            @Override
            public void run() {
                lockB.lock();
                System.out.println("Thread 2: Holding lock B...");
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("Thread 2: Waiting for lock A...");
                {
                    lockA.lock();
                    System.out.println("Thread 2: Acquired lock A!");
                    lockA.unlock();
                }
                lockB.unlock();
            }
        }.start();
    }
}
相关推荐
源码宝1 天前
MES系统源码:Java8 + SpringBoot2.7 + MySQL8 + Redis,后端源码清爽易扩展
java·后端·源码·springboot·mes系统·源码二开·mes源码
JAVA社区1 天前
Java高级全套教程(十)—— SpringCloudAlibaba超详细实战详解
java·开发语言·spring cloud·面试·职场和发展
弥树子1 天前
踩坑记录:服务器内网调用接口,真实请求URL与官方公开URL不一致问题排查
开发语言·php
金銀銅鐵1 天前
[Java] 如何理解 class 文件中方法的 descriptor?
java·后端
云烟成雨TD1 天前
Spring AI Alibaba 1.x 系列【63】AI Agent 长期记忆
java·人工智能·spring
z落落1 天前
C# ToCharArray + foreach遍历 + String与StringBuilder
开发语言·c#
憧憬成为java架构高手的小白1 天前
苍穹外卖--day09
java·spring boot·百度
学代码的真由酱1 天前
Java多用户一对一网页聊天室-测试报告
java·开发语言·功能测试·测试
人道领域1 天前
【LeetCode刷题日记】669.修剪二叉搜索树
开发语言·python·算法
Jasonakeke1 天前
SpringBoot自动配置原理揭秘
java·spring boot·后端