当我们在线程环境中使用wait并通知时。我有一个类来处理数据作为后台进程。当没有数据需要处理时,应该调用wait。
synchronized(some_object){
wait();
}
在另一个课程中,我再次添加数据。我需要调用notify()
方法。
synchronized(some_object){
runnabale_object.notify();
}
为什么我应该在这两个不同的类中使用同一个对象进行同步块。因为我读同步已经习惯了
“已同步”关键字阻止对块的并发访问 多个线程的代码或对象。
但这两个是不同的块。但是当我们使用多个线程时,我可以理解这个问题。而一个线程块其他可以在同一个线程调用notify之前调用notify。
我的问题
答案 0 :(得分:1)
我们可以为单线程环境使用不同的锁对象(synchronized(object))吗?
在单线程环境中,您不需要锁。你可以使用你想要的任何东西,也可以什么都不用。
在单线程环境中,您可以保证没有线程在等待(),因此notify()将不会执行任何操作。
当我们等待并在不同的类中通知时,最好的方法是使用相同的锁定对象吗?
当您通知()时,您必须执行状态更改。当你在循环中wait()时,你会检查那个状态变化。如果你不这样做,你可能有两个问题。
答案 1 :(得分:0)
当没有数据要处理时,它应该调用wait。
不是时间,而是而。
等待并通知低级原语操作,这些操作应以非常具体的方式使用。
在消费者主题中:
synchronized(lock) {
while (thereIsNothingToProcess()) {
lock.wait();
}
processSomething();
}
在生产者线程中:
synchronized(lock) {
makeSomethingAvailableToProcess();
lock.notifyAll(); //or lock.notify() if you think you can get away with it.
}
如果你遵循这个确切的模式,那么:
答案 2 :(得分:0)
我有同样的问题,所以我查了一下。可以在同一对象中使用两个同步块的原因是,“ wait()”实际上将释放监视器,以便其他线程可以获取同一对象的监护人。