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();
    }
}
相关推荐
源码宝2 小时前
云HIS系统源码,HIS全套源码,支持监管系统对接与二次开发
java·源码·电子病历·云his系统·程序代码·全套源码
kimnoic2 小时前
Python操作xlwings的实例详解
开发语言·python
萧瑟余晖2 小时前
Spring MVC拦截器异常处理与跨域详解
java·spring·mvc
泡茶喝茶写代码2 小时前
A股量化数据工程:从 REST 接口到策略信号(第 17 篇):创新高与新低扫描
java·python·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
栗子~~2 小时前
java - logstash-logback-encoder 集成 demo
java·开发语言·logback
hmb↑2 小时前
高并发与高可用技术经验
java·spring
楚识科技3 小时前
XML配置OCR接入实战:自定义OCR模板从字段定义到API调用全流程
xml·java·ocr
ESDWAN3 小时前
跨境网络频繁掉线怎么排查?从企业内网到 SD-WAN 链路的故障诊断
开发语言·网络·php
程序员zgh3 小时前
C++ erase() 函数用法
c语言·开发语言·c++·学习
小蒜学长3 小时前
基于Java的公司采购系统的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端·公司采购系统