[英]How does wait() get the Lock back in Java
这是一个倡导的范例,应该在synchronized块内的while循环内调用wait()。
我的问题是waiting()线程如何获得锁定?
// Thread 1
synchronized (mon) {
while (!condition)
mon.wait();
// Do something
}
//Thread 2
synchronized (mon) {//set condition appropriately
mon.notify();
}
考虑线程1首先运行并开始等待条件。 它释放锁并且线程2获得锁设置条件并通知线程1.现在线程1获取锁,检查条件并开始执行“做某事”。
我的问题是,当线程1被通知它从while条件开始执行时,具有Synchronized(mon)的代码行永远不再执行,那么线程1如何获得锁定? 将锁定回到线程1的内部动态是什么?
当Thread1被通知时,线程必须先获取锁,然后才能退出wait方法,请参阅java doc for Object#wait:
然后从该对象的等待集中删除线程
T
并重新启用线程调度。 然后它以通常的方式与其他线程竞争,以便在对象上进行同步; 一旦它获得了对象的控制权,它在对象上的所有同步声明都将恢复到原状 - 即,调用wait
方法时的情况。 线程T
然后从wait
方法的调用返回。 因此,从wait
方法返回时,对象和线程T
的同步状态与调用wait
方法时的状态完全相同。
synchronized(mon)
不是必须执行的表达式。
它是源代码中的语法元素,告诉编译器(然后是运行时)代码的包装部分必须仅在当前线程获取与mon
关联的锁之后执行,即使您没有“来自“同步块之前的代码行。
wait()
释放锁,并且必须在返回之前重新获取它。
通知线程1后,它立即获得锁定并开始运行//执行某些操作 。
当线程1等待时,它只是暂时释放锁,并且当通知线程时,它可以再次获得锁定并且不需要运行synchronized(...)。
// Thread 1
synchronized (mon) {
Systemout.println("I am invoked!");
while (!condition)
mon.wait();
// Do something
}
//Thread 2
synchronized (mon) {//set condition appropriately
mon.notify();
}
在原始场景中:考虑线程1首先运行并开始等待条件。 它释放锁并且线程2获得锁设置条件并通知线程1.现在线程1获取锁,检查条件并开始执行“做某事”。
如果我理解以下内容:
然后从该对象的等待集中删除线程T并重新启用线程调度。 然后它以通常的方式与其他线程竞争,以便在对象上进行同步; 一旦它获得了对象的控制权,它在对象上的所有同步声明都将恢复到原状 - 即,调用wait方法时的情况。 线程T然后从wait方法的调用返回。 因此,从wait方法返回时,对象和线程T的同步状态与调用wait方法时的状态完全相同。
Systemout.println行(“我被调用!”); 将不会被执行,因为“因此,从wait方法返回时,对象和线程T的同步状态与调用wait方法时的状态完全相同。”
我对吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.