Java 理解多线程

Java 理解多线程,java,multithreading,Java,Multithreading,我只是有一个关于并发运行的线程和它们对对象的锁的问题。据我所知,调用wait()方法的线程将进入等待列表,并允许阻止列表中的另一个线程接管对象上的锁(在同步代码中)。 如果这个对象上现在有锁的线程调用notify()方法,它会唤醒调用wait()的线程,并将其移动到阻止列表中 调用notify()方法的线程会发生什么情况。它是否仍然锁定对象,还是现在已进入等待列表 通知线程仍然拥有锁。见第17.14节(本页底部): 仅当当前线程已锁定对象的锁时,才应为对象调用notify方法。如果对象的等待集不

我只是有一个关于并发运行的线程和它们对对象的锁的问题。据我所知,调用wait()方法的线程将进入等待列表,并允许阻止列表中的另一个线程接管对象上的锁(在同步代码中)。 如果这个对象上现在有锁的线程调用notify()方法,它会唤醒调用wait()的线程,并将其移动到阻止列表中

调用notify()方法的线程会发生什么情况。它是否仍然锁定对象,还是现在已进入等待列表


通知线程仍然拥有锁。见第17.14节(本页底部):

仅当当前线程已锁定对象的锁时,才应为对象调用notify方法。如果对象的等待集不是空的,那么将从等待集中删除一些任意选择的线程,并重新启用线程调度。(当然,在当前线程放弃对象的锁定之前,该线程将无法继续。)


否,它将通过离开同步块或从同步方法返回来释放锁。在再次调用
wait()
之前,它不会返回等待列表

只有一个线程可以持有对象的锁。当线程在调用这些方法的对象上持有锁时,必须调用
wait()
notify()
方法;如果它们不同步(例如,因为您没有在对象上同步),您将得到一个
IllegalMonitorStateException

当您调用
wait()
时,线程将放弃锁并进入等待列表(停止执行)。当
wait()
返回时,线程将再次获得锁。但是,调用
notify()
的线程仍然持有锁,因此在通知线程退出
synchronized
块或方法之前,等待的线程不会恢复,从而释放对象上的锁

通过调用
notify()
线程不会放弃对对象的锁定

可能的事件顺序是:

  • 线程1进入
    synchronized
    块,获取对象的锁
  • 线程1调用对象上的
    wait()
    ,放弃锁,停止执行
  • 线程2进入
    synchronized
    块,获取对象的锁
  • 线程2调用对象上的
    notify()
    ,但仍然持有锁
  • 线程1被唤醒并试图获得锁,但它不能,因为线程2仍然拥有它(因此线程1必须等待锁)
  • 线程2退出
    synchronized
    块并释放锁
  • 线程1现在可以从
    wait()