1、 当notify()被调用,但没有线程等待会发生什么?
在一般情况下,如果这些方法被正确使用,大多数情况下都不会出现这种情况。但如果notify() 方法被调用时,没有其它线程等待,notify。只是返回,并丢失通知。
由于等待和通知机制不知道它发送通知的条件,所以假设没有线程等待,通知将被忽略。一个 后来执行的wait。方法的线程必须等待下一个通知发生。
2、 wait()方法释放或获取锁的时候是否存在一个竞争条件?
wait()方法与锁机制紧密结合。在等待线程处于接收通知的状态之前,对象锁实际上不会释放。 这意味着只有当线程状态发生变化时,它才能够接收通知,锁才被保存。该系统这个机制防止 任何竞争条件发生。
类似地,系统确保在将线程移动到等待状态之前完全锁定对象。
4、 如果一个线程接受到通知,那么是否就保证了条件是被正确设置的?
简单地说,不保证,调用wait()方法之前,一个线程在拥有同步锁的情况下应该一直测试条 件。在从wait()方法返回,线程应该一直测试条件来决定是否应该再等待。这是因为另一个 线程也可以测试条件并确定等待是不必要的一一处理由通知线程设置的有效数据。
5、 当多个线程等待通知时会发生什么情况?调用notify()方法是实际上是哪个线程被唤醒?
这取决于许多因素。Java规范不确定哪个线程被唤醒。在运行时,该线程被唤醒基于几个因 素,包括在程序执行过程中的Java虚拟机和调度和时序问题的实现。即使在单个处理器平台 上,也无法确定多个线程被唤醒的方式。
就像notify()方法,notifyall()方法不允许我们决定哪个线程被唤醒:他们都被唤醒。当所 有的线程被唤醒,可以制定一个机制,线程之间选择那个线程应该继续,那个或者那些线程应 该又调用wait()方法继续等待
6、notifyall()方法是否真正唤醒所有的线程?
是也不是,所有等待的线程唤醒,但他们仍需要获取对象锁。因此线程不能并行运行:它们必 须等待对象锁被释放。在一个时间只有一个线程可以运行。
6、如果只有一个线程要执行,为什么要唤醒所有线程呢?
有几个原因。例如,可能有不止一个条件需要等待。由于我们无法控制哪个线程被唤醒,所以 通知完全可以唤醒等待完全不同状态的线程。通过唤醒所有线程,我们可以设计程序,以便线 程自行决定下一个线程应该执行什么。另一种选择可能是,当生产者生成能够满足多个消费者 的数据时。由于很难确定有多少消费者可以被通知,一个选择是通知他们所有人,让消费者自行处理。
Was this helpful?
0 / 0