问题遇到的现象和发生背景
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实现不了死锁
我想要达到的结果
弄清以上两种不同结果的原因是什么