如果在临界区开始时调用 notifyAll 会怎样

What if notifyAll is called at the start of critical section

如果在cs(critical section)结束时未释放锁的临界区开始时调用notifyAll会怎样?等待线程会怎样?

notifyAll 是否会被所有线程听到并且所有线程都会尝试获取锁并失败(因为 notify/notifyAll 不释放锁)并继续尝试直到他们获得锁?

那么,在临界区开始和结束时调用notify有什么区别?为什么建议在cs结束时调用notifyAll?

当您调用 notifyAll() 时,所有等待线程都将重新激活并尝试获取您调用 notifyAll() 的对象上的锁。

恕我直言,您的代码的正确性并没有被牺牲 - 只要当前线程(调用 notifyAll() 的线程)持有锁,其他线程就无法获取锁。

但性能会受到影响 - 唤醒线程占用处理器资源,让线程尝试获取锁占用处理器资源,等待锁释放占用处理器资源。


通常,在关键部分末尾调用 notifyAll() 的建议很容易实现,因为您的线程正在关键部分进行一些处理,并且在该处理结束时它注意到它应该通知等待他们可以继续的线程。在这种情况下,通知其他线程它们可以继续,然后再确定确实是这种情况没有任何意义。