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日

悬赏问题

  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真