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日

悬赏问题

  • ¥15 关于react-hook组件用函数控制是否渲染的及时性问题。
  • ¥50 Linux下的软件,要做模块化拆分。进程间通信是否有开源框架可以借用?
  • ¥100 修改原有的MYSQL存储代码,在最右边添加多列数据
  • ¥20 Open Interpreter 使用时报错: still has pending operation at deallocation, the process may crash
  • ¥15 qt中链接动态链接库,调用其中的函数,该函数的参数需要传入回调函数,自己创建的回调函数无法作为参数传递进去
  • ¥15 如何把api接口返回的json数据自动计算分页自动执行并写入mysql数据库。
  • ¥15 matlab svm二分类代码问题
  • ¥40 求一款能支持ios15以上的屏蔽越狱插件。比较好用的
  • ¥15 C++ QT对比内存字符(形式不定)
  • ¥30 C++第三方库libiconv 远程安装协助