假设有两个线程正在等待执行同步块。现在有机会了,在这种情况下,我真的需要调用notify()吗?我认为当同步块执行完成时,其他线程会释放锁吗?notify()方法的确切用法是什么?
请线程专家解释一下?
发布于 2014-02-04 13:00:51
不,在这种情况下,您不需要使用notify()。您是正确的,必须等待获取锁的线程将在锁被释放后自动继续。
notify()方法与wait()方法一起工作。当一个线程调用wait()时,它可能会释放锁并开始等待。结束等待的条件之一是当另一个线程调用notify()时。必须在当前线程为synchronized的实例上同时调用wait()和notify()。
例如,这可用于在两个线程之间创建通道,其中一个线程正在使用另一个线程产生的信息。如果消费者耗尽了要处理的信息,它可能会wait(),直到生产者执行一个notify(),表明有更多的数据可用。
发布于 2014-02-04 12:50:21
当线程进入同步块并调用wait时,进入同步块时获得的锁被释放,线程等待其他线程通知它,在这种情况下,它将重新获得锁,并且当线程离开同步块时,proceed.Lock再次被释放。
发布于 2014-02-04 12:50:49
从doc,
唤醒正在等待此对象的监视器的单个线程。如果有任何线程正在等待这个对象,则选择其中一个线程进行唤醒。这种选择是任意的,由实现决定。线程通过调用其中一个wait方法在对象的监视器上等待。
因此,如果一个对象正在等待,可以调用一个wait方法。然后,您可以使用notify唤醒它们。
https://stackoverflow.com/questions/21544140
复制相似问题