wait()如何在Java中获取Lock

Gee*_*eek 14 java multithreading synchronization locking wait

这是一个倡导的范例,应该在synchronized块内的while循环内调用wait().

我的问题是waiting()线程如何获得锁定?

// Thread 1
    synchronized (mon) {
     while (!condition) 
          mon.wait();

    // Do something
    }

//Thread 2
    synchronized (mon) {//set condition appropriately
            mon.notify();
    }
Run Code Online (Sandbox Code Playgroud)

考虑线程1首先运行并开始等待条件.它释放锁并且线程2获得锁设置条件并通知线程1.现在线程1获取锁,检查条件并开始执行"做某事".

我的问题是当线程1被通知它从while条件开始执行时,具有Synchronized(mon)的代码行永远不再执行,那么线程1如何获得锁定?将锁定回到线程1的内部动态是什么?

Nat*_*hes 8

当Thread1被通知时,线程必须先获取锁,然后才能退出wait方法,请参阅java doc for Object#wait:

T然后从该对象的等待集中删除该线程,并重新启用该线程以进行线程调度.然后它以通常的方式与其他线程竞争,以便在对象上进行同步; 一旦它获得对象的控制权,对象的所有同步声明都将恢复到原状 - 即,wait 调用方法时的情况.线程T然后从wait方法的调用返回.因此,从wait方法返回 时,对象和线程的同步状态与调用方法T时的状态 完全相同wait.


JB *_*zet 7

synchronized(mon) 不是必须执行的表达式.

它是源代码中的一个语法元素,告诉编译器(然后是运行时)代码的包装部分必须仅mon在当前线程获取了与之关联的锁之后执行,即使您没有"来来自"同步块之前的代码行".

wait() 释放锁,并在返回之前必须重新获取它.

  • @saury:确切地说,通知线程在调用notify()时不释放锁.它仅在从同步块退出时才会释放. (3认同)