当前位置: 首页 > 面试题库 >

Java死锁问题

殳毅
2023-03-14
问题内容

谁能解释一下为什么这段代码中会出现死锁。

public class Deadlock {
    static class Friend {
        private final String name;
        public Friend(String name) {
            this.name = name;
        }
        public String getName() {
            return this.name;
        }
        public synchronized void bow(Friend bower) {
            System.out.format("%s: %s has bowed to me!%n", 
                    this.name, bower.getName());
            bower.bowBack(this);
        }
        public synchronized void bowBack(Friend bower) {
            System.out.format("%s: %s has bowed back to me!%n",
                    this.name, bower.getName());
        }
    }

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

问题答案:

这可能是如何执行的。

  1. 输入alphonse.bow(gaston);,由于synchronized关键字已锁定Alphonse
  2. 输入gaston.bow(alphonse);,加斯顿现已锁定
  3. 无法bower.bowBack(this);通过第一个bow方法调用执行,因为加斯顿(鲍尔)被锁定。等待锁被释放。
  4. 由于alphonse(上弦器)已锁定,因此无法bower.bowBack(this);从第二个bow方法调用执行。等待锁被释放。

两个线程都互相等待释放锁。



 类似资料:
  • 为什么java可重入锁不会导致死锁?

  • 主要内容:示例,死锁解决方案示例死锁描述了两个或多个线程等待彼此而被永久阻塞的情况。 当多个线程需要相同的锁定但以不同的顺序获取时,会发生死锁。 Java多线程程序可能会遇到死锁状况,因为关键字会导致执行线程在等待与指定对象相关联的锁定或监视时出现阻止情况。 看看下面一个例子。 示例 当您编译并执行上述程序时,会出现死锁情况,以下是程序生成的输出 - 上述程序将永久挂起,因为两个线程都不能继续进行,等待彼此释放锁定,所以您可以按

  • 主要内容:1 什么是Java线程死锁,2 Java线程死锁的例子1 什么是Java线程死锁 Java中的死锁是多线程的一部分。当线程正在等待由另一个线程获取的对象锁而第二个线程正在等待由第一个线程获取的对象锁时,可能会发生死锁。由于两个线程都在互相等待释放锁,因此这种情况称为死锁。 2 Java线程死锁的例子 输出结果为:

  • 问题内容: 我正在学习Java的死锁,并且有来自Sun官方教程的以下示例代码: 阿方斯(Alphonse)和加斯顿(Gaston)是朋友,也是礼貌的忠实信徒。严格的礼貌规则是当您向朋友鞠躬时,您必须保持鞠躬,直到您的朋友有机会归还弓箭为止。不幸的是,该规则不能解决两个朋友可能同时鞠躬的可能性。 这是Sun的解释: 死锁运行时,两个线程极有可能在尝试调用bowBack时阻塞。两个块都不会结束,因为每

  • 本文向大家介绍java 中死锁问题的实例详解,包括了java 中死锁问题的实例详解的使用技巧和注意事项,需要的朋友参考一下 java 中死锁问题的实例详解 先看代码在做解释 以上是代码部分,如果没有死锁,可以在if下加while(true),必然死锁,下面来做说明。 这个仅仅是为了理解死锁和面试用的,创建两个对象a和b只是为了作为死锁的对象而用,线程t1运行(t1.start()),线程t1拿到锁

  • 死锁概念 死锁(Deadlock)就是一个进程拿着资源A请求资源B,另一个进程拿着资源B请求资源A,双方都不释放自己的资源,导致两个进程都进行不下去。 示例程序 我们可以写代码模拟进程死锁的例子。 package main func main() { ch := make(chan int) <-ch } 运行结果 root@fa13d0439d7a:/go/src# go run de