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();
    }
}
相关推荐
Wang's Blog23 分钟前
Java 接入Redis: 五大数据类型与存储结构选型
java·服务器·redis
Wang's Blog26 分钟前
Java 接入Redis: 字符串与哈希类型操作命令
java·服务器·redis
智慧物业老杨5 小时前
物业数字化落地思考:真正的转型,是底层数据秩序的重构
java·大数据·人工智能·微服务·系统架构
星空7 小时前
金蝶苍穹build.gradle配置
java·build.gradle
C++ 老炮儿的技术栈9 小时前
我们在设计tcp协议时,要传一个字符串过去,报文:头十长度十内容,是否要把‘\0‘也填入,长度是否包含‘\0‘
开发语言·数据结构·c++·mfc·c
传奇开心果编程9 小时前
【Rust入门练中学】第2课:变量、可变性与常量
开发语言·学习·rust
zr想努力10 小时前
从0开始配置Perforce4环境
开发语言
步行cgn10 小时前
Spring 基于 XML 的自动装配:byName 详解
java·后端·spring
大帅点兵11 小时前
Apache Ant 1.9.9 完整讲解
java
幸运小圣11 小时前
PointerEvent 常用属性与事件整理【JavaScript】
开发语言·javascript·ecmascript