在同一台监视器上等待的两个线程可以称为死锁吗?

S. *_*Doe 6 java multithreading deadlock

两个线程在同一个监视器上等待,例如,如果一个线程在"lock"上调用wait,而另一个获取监视器的线程在通知第一个线程之前也调用wait.现在两个线程都在等待,但没有人得到通知.我怎么称呼这种情况?这可以称为僵局吗?

编辑: 假设这些是唯一的两个线程,并且无法从其他地方通知它们.
更新:我刚刚创建了我所描述的情况.以下代码在侦听器线程之前启动更换器线程的大部分时间都可以正常工作.但是,当我在更换器之前启动监听器时,程序只会在打印两行(一个来自转换器,一个来自侦听器线程)后挂起.我在更换器之前调用监听器的情况会被称为死锁吗?

package demo;

public class ProducerConsumer {

public static int SAMPLE_INT = 0;

public static void main(String[] args) {

    PC pc = new PC();

     Thread changer = new Thread(new Runnable() {
        public void run(){
            try {
                pc.producer();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
     });

    Thread listener = new Thread(new Runnable(){
        public void run() {
            try {
                pc.consumer();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    });
    changer.start();
    listener.start(); 
   }
 }

class PC {

Object lock = new Object();

public void producer() throws InterruptedException {
    synchronized(this){
        for (int i=0; i<5; i++){
            ProducerConsumer.SAMPLE_INT++;
            System.out.println("Changed value of int to: " + ProducerConsumer.SAMPLE_INT);
            wait();
            notify();
           }
    }
}

public void consumer() throws InterruptedException{
    synchronized(this){
        for (int i=0; i<5; i++){
            System.out.println("Receieved Change: " + ProducerConsumer.SAMPLE_INT);
            notify();
            wait();
           }
         }
       }
     }
Run Code Online (Sandbox Code Playgroud)


在监听器之前启动转换器时的输出:
将int的值更改为:1
收到的更改:1
将int的值更改为:2
收到的更改:2
将int的值更改为:3
收到的更改:3
将int的值更改为:4
收到的更改:4
将int的值更改为:5
收到的更改:5
程序终止.

监听器在转换器之前启动时的输出:收到的
更改:0
将int的值更改为:1
程序不会终止.

谢谢.

And*_*ndy 6

如果这些是唯一涉及的两个线程(例如,访问监视器),那么是.如果有其他线程可以访问监视器并解锁它,那么没有.

但请记住,您正在谈论两个主题 - 监视器通常是线程术语中的互斥体.但是wait条件变量相关联的东西虽然需要互斥量才能工作,但是根据一个线程向另一个线程发出信号的情况执行一个故意阻塞线程的更微妙的任务,并带有一个称为虚假唤醒的警告.

  • @ThomasStets - 一个线程*必须在它拥有的监视器上*`wait`,否则它不能保证谓词(即等待的条件)真正受到保护.还有别的东西都是个bug. (2认同)