用于等待和通知的Java线程同步对象
当我们在线程环境中使用wait和notify时。 我有一个类来处理数据作为后台进程。 当没有数据需要处理时,应该等待。
synchronized(some_object){
wait();
}
在另一课中,我再次添加数据。 我需要调用notify()
方法。
synchronized(some_object){
runnabale_object.notify();
}
为什么我应该在这两个不同的类中为同步块使用相同的对象。 正如我读同步习惯
“同步”关键字阻止多个线程同时访问一段代码或对象。
但是这两个是不同的块。 但是当我们使用多线程时,我可以理解这个问题。 而一个线程阻塞其他线程可以在同一个线程调用notify之前调用notify。
我的问题
我们可以为单线程环境使用不同的锁对象(synchronized(object))吗?
在单线程环境中,您不需要锁。 你可以使用任何你想要的或者什么都没有。
在单线程环境中,您可以保证没有线程处于等待状态,因此notify()将不会执行任何操作。
当我们在不同的类中等待并通知时,使用相同的锁对象的最佳方式是什么?
当您通知()时,您必须执行状态更改。 当你在一个循环中等待()时,你需要检查状态变化。 如果你不这样做,你可能会遇到两个问题。
当没有数据要处理时,应该调用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.
}
如果你遵循这个确切的模式,那么: