Java 调用wait()方法后是否释放锁?

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.

我在读Java中的等待和通知

我将用一个小例子来解释:

@Override
    public void run() {
        synchronized (msg) {
            try{
                msg.wait();
            }catch(InterruptedException e){
                e.printStackTrace();
            }
            System.out.println(name+" processed: "+msg.getMsg());
        }
    }
这里它说当我们进行
同步(msg)
时。当前线程T1将锁定msg对象

因此,可以通过两种方式释放锁:

  • 同步块完成后
  • T1调用wait()时

  • 如果另一个线程调用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没有必要在收到通知后立即开始执行,它与等待访问对象锁的其他线程竞争。