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();
    }
}
相关推荐
小短腿的代码世界9 小时前
Qt实时盈亏计算深度解析:从持仓数据到动态盈亏展示
开发语言·qt
小康小小涵9 小时前
基于ESP32S3实现无人机RID模块底层源码编译
linux·开发语言·python
lzjava20249 小时前
Python的函数
开发语言·python
掌心向暖RPA自动化10 小时前
如何获取网页某个元素在屏幕可见部分的中心坐标影刀RPA懒加载坐标定位技巧
java·javascript·自动化·rpa·影刀rpa
Awesome Baron10 小时前
skill、tool calling、MCP区别
开发语言·人工智能·python
日取其半万世不竭10 小时前
Minecraft Java版社区服务器搭建教程(Linux,适合新手)
java·linux·服务器
Python私教10 小时前
GenericAgent PySide6 桌面应用深度解析:悬浮按钮 + 聊天面板的原生 Qt 方案
开发语言·数据库·qt
矢志航天的阿洪10 小时前
用 MATLAB 控制 STK Aviator:从零搭建一个 AWACS 支援作战场景
开发语言·matlab
澈20710 小时前
STL迭代器:容器遍历的万能钥匙
开发语言·c++
TeamDev11 小时前
JxBrowser 9.0.0 版本发布啦!
java·前端·混合应用·jxbrowser·浏览器控件·跨平台渲染·原声输入