Cloud程序 2023-02-17 08:56 采纳率: 62.5%
浏览 21

Java多线程、死锁

今天复习多线程的时候,在网上看到一段代码百思不得其解,望各位经过的学长学姐指点

疑问1、为什么都调用到bower.bowBack(this);就不往下执行了,都没有进入bowBack方法,什么条件造成的死锁?

疑问2、为什么输出语句System.out.format换成System.out.println就变成了重复执行者两个方法?反而不会造成死锁。

package cn.edu.jyu.secure;

public class DeadLock {
    static class Friend {
        private final String name;

        Friend(String name) {
            this.name = name;
        }

        String getName() {
            return this.name;
        }

        synchronized void bow(Friend bower) {
            System.out.format("%s: %s"
                            + "  has bowed to me!%n",
                    this.name, bower.getName());
            bower.bowBack(this);
        }

        synchronized void bowBack(Friend bower) {
            System.out.format("%s: %s"
                            + " has bowed back to me!%n",
                    this.name, bower.getName());
            bower.bow(this);
        }
    }

    public static void main(String[] args) {
        final Friend alphonse =
                new Friend("Alphonse");
        final Friend gaston =
                new Friend("Gaston");
        new Thread(() -> alphonse.bow(gaston)).start();
        new Thread(() -> gaston.bow(alphonse)).start();
    }
}

  • 写回答

2条回答 默认 最新

  • CodeBytes 2023-02-17 09:00
    关注

    该回答引用ChatGPT
    1、该代码中的死锁是由于双方互相持有对方对象的锁,从而造成无法继续执行的情况。具体来说,线程A获得了对象A的锁并执行了bow方法,然后它试图去调用对象B的bowBack方法,但是由于对象B被线程B持有并加锁了,所以线程A在执行到bower.bowBack(this)时会被阻塞,无法继续执行。同时,线程B也在等待对象A的锁,因此两个线程都在等待对方释放锁,造成了死锁。

    2、System.out.format和System.out.println都可以输出内容到控制台,但是它们的格式化方式不同。System.out.format方法使用了类似于C语言中的printf函数的格式化字符串方式,可以将指定的参数根据格式化字符串的要求进行格式化输出。而System.out.println方法则直接输出指定的内容,不进行任何格式化操作。在这个例子中,如果将System.out.format换成System.out.println,那么输出的内容就不会按照预期进行格式化,而是直接输出。因此,这两种方法的使用应该根据实际需求进行选择。

    评论

报告相同问题?

问题事件

  • 创建了问题 2月17日

悬赏问题

  • ¥15 两台交换机分别是trunk接口和access接口为何无法通信,通信过程是如何?
  • ¥15 C语言使用vscode编码错误
  • ¥15 用KSV5转成本时,如何不生成那笔中间凭证
  • ¥20 ensp怎么配置让PC1和PC2通讯上
  • ¥50 有没有适合匹配类似图中的运动规律的图像处理算法
  • ¥15 dnat基础问题,本机发出,别人返回的包,不能命中
  • ¥15 请各位帮我看看是哪里出了问题
  • ¥15 vs2019的js智能提示
  • ¥15 关于#开发语言#的问题:FDTD建模问题图中代码没有报错,但是模型却变透明了
  • ¥15 uniapp的h5项目写一个抽奖动画