如果你看一下描述条件变量(cv)用法的文档,你会看到,例如:在PThreads和C ++中,您不需要保持cv的互斥锁来调用此cv上的notify。例如,在Java和Python中,您必须锁定互斥锁以执行相同的操作。
为什么事情以这种方式实现有一些深层原因(我是关于后一种情况),因为像Java这样的语言的实现最终会使用一些原生的线程工具?
答案 0 :(得分:0)
Java notify
和notifyAll
基本同步工具都要求您在调用对象之前对其进行同步。这是一个简单的安全点,因为它还要求您在wait
之前同步它们。
例如,如果你有两个线程。一个线程从缓冲区读取数据,一个线程将数据写入缓冲区。
读取数据线程需要等到写入数据线程完成将数据块写入缓冲区然后才能读取块。
如果可以在没有同步的情况下调用wait()
,notify()
和notifyAll()
方法,那么您可以获得竞争条件:
读取线程调用wait()
,并将线程添加到等待队列中。
同时,写作线程调用notify()
表示已添加数据。
由于在notify()
之前处理了wait()
,因此阅读线程错过了更改并永远等待。
通过强制wait
和notify
在同步块中发生,此争用条件将被删除。