【发布时间】:2015-11-06 00:56:19
【问题描述】:
当我们在线程环境中使用等待和通知时。我有一个类来处理数据作为后台进程。当没有数据需要处理时,它应该调用wait。
synchronized(some_object){
wait();
}
在另一个类中,我再次添加数据。我需要调用notify() 方法。
synchronized(some_object){
runnabale_object.notify();
}
为什么我应该在这两个不同的类中对同步块使用相同的对象。当我阅读同步用于
“Synchronized”关键字防止并发访问一个块 多个线程的代码或对象。
但这两个是不同的块。但是当我们使用多个线程时,我可以理解这个问题。而一个线程阻塞另一个线程可以在同一个线程调用通知之前调用通知。
我的问题
- 我们可以为单线程环境使用不同的锁对象(synchronized(object))吗?
- 当我们在不同的类中等待和通知时,使用同一个锁对象的最佳方式是什么?
【问题讨论】:
-
您必须在锁定对象上调用
wait和notify(在您的情况下为some_object.wait()和some_object.notify())! -
您的代码实际上并不能正常工作,来自the Javadoc 当前线程必须拥有此对象的监视器。(强调我的) .因此,如果您想使用
wait/notify,那么等待/通知Thread必须拥有它正在运行的Object的监视器。这也回答了您的问题,您必须对synchronizing使用与wait/notify相同的对象。
标签: java multithreading synchronization