java - 理解死锁、同步

标签 java multithreading

<分区>

我最近在 oracle 网站上阅读了有关 java 教程的并发性。今天我阅读了有关死锁/同步的内容,我能够理解一些事情。

同步:

同步方法:没有两个线程可以调用同一对象的两个不同的同步方法。这意味着在给定的时间点,即使有多个其他同步方法,每个对象也只会执行一个同步方法。

我的理解对吗?

死锁:

在下面的代码中出现了死锁,但我就是不明白为什么?为什么两个线程都在等待对方退出 bow 方法?

package com.tutorial;

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(锁定 apohonse)
  2. gaston.bow(锁定加斯顿)
  3. alphonse.bow 调用 gaston.bowback(无法锁定 gaston,因为在 alphonse 的线程中被阻塞但持有 alphonse 锁)
  4. gaston.bow 调用 alphose.bowback(无法锁定 alphose,因为在 gaston 的线程中被阻塞但持有 gaston 锁)

死锁

关于java - 理解死锁、同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25120328/

相关文章:

c++ - 多个线程可以等待同一个条件变量吗?

java - Java中的线程应该如何关闭自己?

java - 关闭背景图像触摸 libgdx 上的对话框

java - Apache nifi 无法启动

java - 将 .txt 解析为 .csv

java - 我是否应该同步访问存储 `DataSource` 的最终静态属性(在服务器启动时设置一次)?

Java 1.6内存泄漏: HashMap and ArrayList

JavaFx 音频输出选择

用于同时处理多个请求的 SOAP 服务器的 Python 库?

Java 线程和 .sleep() 混淆