T1747989800 2022-09-02 20:23 采纳率: 50%
浏览 33
已结题

java线程死锁测试类注意事项

问题遇到的现象和发生背景
    new Thread(new BigHammer(gun,bullet)).start();
    new Thread(new TwoDog(gun,bullet)).start();

这种无法死锁
但是 下面这种可以死锁
BigHammer big = new BigHammer(gun,bullet);
TwoDog two =new TwoDog(gun,bullet);
new Thread(big).start();
new Thread(two).start();

问题相关代码,请勿粘贴截图

大锤线程对象

public class BigHammer implements Runnable {
    private Object gun;
    private Object bullet;
    public BigHammer(Object gun, Object bullet) {
        this.gun = gun;
        this.bullet = bullet;
    }
    @Override
    public void run() {
        synchronized (bullet) {
            System.out.println("大锤捡到了子弹");
            synchronized (gun) {
                System.out.println("大锤拿到了M4");
                System.out.println("大锤开火了二狗英勇就义");
            }
        }
    }
}

二狗线程对象


public class TwoDog implements Runnable{
    private Object gun;
    private Object bullet;
    public TwoDog(Object gun, Object bullet) {
        this.gun = gun;
        this.bullet = bullet;
    }
    @Override
    public void run() {
        synchronized (gun){
            System.out.println("二狗拿到了M4");
            synchronized (bullet){
                System.out.println("二狗捡到了子弹");
                System.out.println("二狗开火了大锤英勇就义");
            }
        }
    }
}

测试类

public class Test {
    public static void main(String[] args) {
        Object gun = new Object();
        Object bullet = new Object();
        BigHammer big = new BigHammer(gun,bullet);
        TwoDog two =new TwoDog(gun,bullet);
        new Thread(big).start();
        new Thread(two).start();
//        new Thread(new BigHammer(gun,bullet)).start();
//        new Thread(new TwoDog(gun,bullet)).start();
    }
}

运行结果及报错内容

当使用 new Thread(new BigHammer(gun,bullet)).start();
new Thread(new TwoDog(gun,bullet)).start();时,运行结果为
大锤捡到了子弹
大锤拿到了M4
大锤开火了二狗英勇就义
二狗拿到了M4
二狗捡到了子弹
二狗开火了大锤英勇就义
当使用 BigHammer big = new BigHammer(gun,bullet);
TwoDog two =new TwoDog(gun,bullet);
new Thread(big).start();
new Thread(two).start();时运行结果为
二狗拿到了M4
大锤捡到了子弹

我的解答思路和尝试过的方法

先new出对象再用可以实现,直接在线程对象里面new实现不了死锁

我想要达到的结果

弄清以上两种不同结果的原因是什么

  • 写回答

2条回答 默认 最新

  • 新手学堂 2022-09-02 22:47
    关注

    你加个 Thread.sleep()方法中断一下试试,我觉得在一个线程new对象的过程中,另外一个线程已经执行完,释放锁了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 9月10日
  • 已采纳回答 9月2日
  • 修改了问题 9月2日
  • 创建了问题 9月2日

悬赏问题

  • ¥25 大学xml问答,会的请回复
  • ¥15 小贝360-4 配二个 华772S 设置WⅰFi5G 连接
  • ¥15 vs2022的QT报错,好像是缺少winextras
  • ¥15 怎么看 cst中一个面的功率分布图
  • ¥15 c语言数据结构求9999
  • ¥15 Fiddler无法对部分小程序抓包
  • ¥60 Python代码 ip首部检验和计算代码 版本协议 首部长度 源地址 目的地址 存活时间
  • ¥18 微机原理汇编的综合实验
  • ¥15 LD衰减图用R语言对其可视化
  • ¥15 Mermaid语法生成的svg在Axure无法编辑