并发 - 为什么会出现这种僵局

Sol*_*ace 1 java concurrency multithreading

好.我在理解并发的基础知识方面遇到了一些困难.这个问题是关于死锁的.请告诉我为什么这两个线程都陷入僵局.

我从教程中学到了这个例子.它说,

"当Deadlock运行时,两个线程在尝试调用bowBack时极有可能会阻塞.这两个块都不会结束,因为每个线程都在等待另一个线程退出."

我从中理解的是:首先,他们会等待,因为当线程调用synchronized方法时,它会自动获取synchronized方法所属对象的内部锁,并继续拥有它直到方法返回; 同时没有其他线程可以拥有它.

1.现在我的第一个问题是第一个线程调用zarah.bow(),因此内部锁与zarah相关联.第二个线程将调用khan.bow(),因此它将是一个不同的内部锁(因为它与一个名为khan的不同对象相关联),不是吗?

并不是zarah.bow()和khan.bow()不同?因为它们属于两个不同的实例?

第二个问题来自"两个"线程永远等待的概念.两个线程都将永远被阻塞,等待彼此退出.我不懂.

package Threads;

public class DeadlockModified {
    static class Friend {
        private final String name;
        Friend(String name){
            this.name=name;
        }
        private String getName(){
            return this.name;
        }
        private synchronized void bow(Friend bower){
            System.out.format("%s: %s"+" bowed to me.%n",bower.getName(),name); 
            bower.bowBack(this);
        }
        private synchronized void bowBack(Friend bower){
            System.out.format("%s: %s" + " was nice enough to bow back to me.%n",bower.getName() ,name );
        }
    }
    public static void main(String [] args){
        final Friend zarah= new Friend("Zarah");
        final Friend khan= new Friend("Khan");
        new Thread(new Runnable(){
            public void run(){zarah.bow(khan);}
        }).start();
        new Thread(new Runnable() {
            public void run(){khan.bow(zarah);}
        }).start();
    }
}
Run Code Online (Sandbox Code Playgroud)

输出: -

Khan: Zarah bowed to me.
Zarah: Khan bowed to me.
Run Code Online (Sandbox Code Playgroud)

先感谢您.

编辑:-

在本教程的"同步方法"一节中,有人写道,

"从同步代码中调用其他对象的方法可能会产生"活动"部分中描述的问题.

这是关于活力的部分.我看到另一个对象的方法bowBack()是从bow()调用的.还有一些问题 - 看看程序的输出,看起来两个线程都没有执行bowBack().但是没有给出更多细节.

JB *_*zet 5

  • 线程1调用zarah.bow(khan):它获取引用的对象的内部锁zarah
  • 线程2调用khan.bow(zarah):它获取引用的对象的内部锁khan
  • 线程1试图调用khan.bowBack():它需要khan的内在锁才能做到这一点.但是这个锁由线程2保持.因此线程1等待直到线程1释放锁khan
  • 线程2试图调用zarah.bowBack():它需要zarahto的内在锁定能够做到这一点.但是这个锁由线程1保持.因此线程2等待直到线程1释放锁定zarah

因此,两个线程永远都在等待彼此.那是一个僵局.