Java 调用wait()方法后是否释放锁?
我在读Java中的等待和通知 我将用一个小例子来解释:Java 调用wait()方法后是否释放锁?,java,multithreading,thread-safety,Java,Multithreading,Thread Safety,我在读Java中的等待和通知 我将用一个小例子来解释: @Override public void run() { synchronized (msg) { try{ msg.wait(); }catch(InterruptedException e){ e.printStackTrace(); } System.
@Override
public void run() {
synchronized (msg) {
try{
msg.wait();
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.println(name+" processed: "+msg.getMsg());
}
}
这里它说当我们进行同步(msg)
时。当前线程T1将锁定msg对象
因此,可以通过两种方式释放锁:
如果另一个线程调用notify()并唤醒线程T1,T1将再次获得对
msg
对象的锁定权限?是,T1
将在等待时释放锁定,并且它必须在收到通知后重新获得锁定。请参阅中的详细信息
并且,可以在while
循环中调用wait
方法
synchronized (obj) {
while (<condition does not hold>)
obj.wait();
... // Perform action appropriate to condition
}
synchronized(obj){
而()
obj.wait();
…//执行适合条件的操作
}
锁在调用wait()
后释放
如果另一个线程调用notify()并唤醒线程T1,T1将再次获得锁定msg对象的权限
它不会自动访问锁。它必须与其他线程竞争
关于(来自javadocs):
唤醒正在该对象监视器上等待的单个线程。如果有任何线程正在等待此对象,则选择其中一个线程进行唤醒。线程通过调用一个wait方法在对象的监视器上等待
在当前线程放弃对该对象的锁定之前,唤醒的线程将无法继续。唤醒的线程将以通常的方式与任何其他线程竞争,这些线程可能正在积极竞争以在此对象上同步;例如,唤醒的线程在成为下一个锁定此对象的线程时没有可靠的特权或缺点
T1没有必要在收到通知后立即开始执行,它与等待访问对象锁的其他线程竞争。