Wait notify notifyAll
wait() 调用 wait() 方法后,线程进入等待状态, wait() 方法不会返回,直到将来某个时刻,线程从等待状态被其他线程唤醒后, wait() 方法才会返回,然后,继续执行下一条语句。 wait() 方法的执行机制非常复杂,它不是一个普通的Java方法,而是定义在 Object 类的一个 native 方法,也就是由JVM的C代码实现的。 必须在 synchronized 块中才能调用 wait() 方法,因为 wait() 方法调用时,会释放线程获得的锁 , wait() 方法返回后,线程又会重新试图获得锁。 notify()、notifyAll() this.notifyAll() 将唤醒所有当前正在 this 锁等待的线程,而this. notify() 只会唤醒其中一个(具体哪个依赖操作系统,有一定的随机性)。 这是因为可能有多个线程正在 getTask() 方法内部的 wait() 中等待,使用 notifyAll() 将一次性全部唤醒。通常来说, notifyAll() 更安全。有些时候,如果我们的代码逻辑考虑不周,用 notify() 会导致只唤醒了一个线程,而其他线程可能永远等待下去醒不过来了。 但是,注意到 wait() 方法返回时需要 重新 获得 this 锁。假设当前有3个线程被唤醒,唤醒后,首先要等待执行 addTask() 的线程结束此方法后,才能释放 this 锁,随后,这3个线程中只能有一个获取到 this 锁,剩下两个将继续等待。 The instance 上学的时候我们经常会去图书馆借书,这个我印象比较深刻(本来想举买火车票的例子)。图书馆里,有一本书叫《JAVA并发编程实战》,小A早上的时候把这本书借走了,小B中午的时候去图书馆找这本书,这里小A和小B分别是两个线程,他们都要看的书是共享资源。 1.通过共享资源通信 小B去了图书馆,发现这本书被借走了(执行了例子中的hasDataToProcess)。他回到家,等了几天,再去图书馆找这本书,发现这本书已经被还回,他顺利借走了书。 2.忙等待 其实小B在小A走后一会就把书还回去了,小A却在几天后才去找的书。为了早点借到书(减少延迟),小A可能就在图书馆等着,每隔几分钟(while循环)他就去检查这本书有没有被还回,这样只要小B一还回书,小A马上就...