简单Java并发问题
线程1:简单Java并发问题,java,concurrency,synchronization,Java,Concurrency,Synchronization,线程1: if(!conditionFullfiled) this.wait(); 线程2: if(conditionFullfiled) thread1.notify(); 当某个条件已满时,我想从线程2唤醒线程1。但是当调用thread1.notify()时,如果(!conditionfullfield)***此处***this.wait(),是否有问题?您使用什么对象作为“this”?如果在thread1对象上调用wait(),并且所显示的两条语句都包装在如下循环中: 然后,您的代码将
if(!conditionFullfiled) this.wait();
线程2:
if(conditionFullfiled) thread1.notify();
当某个条件已满时,我想从线程2唤醒线程1。但是当调用thread1.notify()
时,如果(!conditionfullfield)***此处***this.wait(),是否有问题代码>?您使用什么对象作为“this”?如果在thread1对象上调用wait(),并且所显示的两条语句都包装在如下循环中:
然后,您的代码将按您想要的方式工作。(当条件为false时,第一个线程将停止,否则将工作)。
诀窍在于线程对象上的交互是同步的,因此一个线程不能在另一个线程处理该对象时中断
编辑:
如果您不在线程上同步,而是在其他对象上同步(您可以简单地创建纯对象来提供锁),那就更好了。没有问题,因为等待释放对象锁(在这种情况下) 最好的做法是在while块中保护等待/通知条件,以避免虚假唤醒。要执行
obj.wait()
和obj.notify()
,您需要拥有要等待/通知的对象的监视器。在代码中,可能不需要thread1.notify()。例如:
Object someSharedObject = ...
线程1:
synchronized(someSharedObject) {
// while NOT if for spurious wake ups.
while(!conditionFullfiled) someSharedObject.wait();
}
线程2:
synchronized(someSharedObject) {
if(conditionFullfiled) someSharedObject.notify(); // this wakes thread1
}
synchronized
锁位于someSharedObject
(可以是this
),这意味着两个线程永远不会冲突.wait()
释放当前保留的监视器,因此当Thread1正在等待时,Thread2不会被阻止
编辑:我学到了一些关于虚假唤醒的知识。.wait()
必须在循环中执行,而循环-如果不够。谢谢恩诺·绍吉教我
编辑:澄清.wait()
释放监视器。这里有两个问题
您不应该对线程对象本身调用wait()和notify()。更好的方法是使用特殊的锁对象,例如
私有对象锁=新对象();
......
lock.wait()
下一个问题是,必须将wait()和notify都调用到synchornized块中,即
同步(锁定){
//一些代码
lock.wait();
}
然后在代码的其他地方说:
syncronized(lock) {
lock.notify(); // this line will cause the wait to terminate and the first thread to continue.
}
可以方便地将wait()
和notify()
包装方法本地化到一个类中,这样它们就可以访问lock对象
欲了解更多信息,请阅读
http://download.oracle.com/javase/6/docs/api/java/lang/Thread.htmlif
应替换为while
以应对虚假唤醒。someSharedObject.wait()
在同步块内被调用-如果Thread1已经在等待,这难道不意味着Thread2永远不会进入另一个同步块吗?@fhucho,wait()
释放当前持有的监视器。@Martin:“真的没有任何东西会随机唤醒线程”根据规范,有。。。我认为wait()
的API文档应该警告这一点@Martin Algesten谢谢,请您再补充一点,wait()会释放所有监视器?
syncronized(lock) {
lock.notify(); // this line will cause the wait to terminate and the first thread to continue.
}