关于concurrency的synchronized的问题,它是如何工作的,范围是什么

Questions about the concurrency‘s synchronized, how it works, what is the scope

我想了解 java 的同步是如何工作的,我已经阅读了一些文档,但是有人可以帮助检查正确性和问题 对于代码块

public class MyWaitNotify3{

  MonitorObject myMonitorObject = new MonitorObject();
  boolean wasSignalled = false;

  public void doWait(){
    synchronized(myMonitorObject){
      while(!wasSignalled){
        try{
          myMonitorObject.wait();
         } catch(InterruptedException e){...}
      }
      //clear signal and continue running.
      wasSignalled = false;
    }
  }

  public void doNotify(){
    synchronized(myMonitorObject){
      wasSignalled = true;
      myMonitorObject.notify();
    }
  }
}
MyWaitNotify3 inst1 = new MyWaitNotify3();
MyWaitNotify3 inst2 = new MyWaitNotify3();

如果我们用 inst1 创建一个线程,用 inst2 创建另一个线程 那么如果我们做thread1.doWait(),那么线程就会挂在“myMonitorObject.wait();”这一行 问题是“dowait”、“synchronized(myMonitorObject)”范围内的锁是否会阻止线程 2 获取“doNotify()”中的锁??

据我了解,由于是两个实例,thread2无法获取doWait中的synchronized(myMonitorObject),但会获取doNotify中的synchronized(myMonitorObject)。对吗?

如果我们定义

会发生什么
MyWaitNotify3 inst1 = new MyWaitNotify3();
thread1 = new Thread(inst1, "A");
thread2 = new Thread(inst1, "B");

The question is that the lock in scope of "dowait", "synchronized(myMonitorObject)", will this blocks thread2 from acquire the lock in "doNotify()"??

不,不会。当线程进入 wait in doWait 的等待状态时,线程将释放关键部分(synchronized 块)的锁。那时,另一个线程可以获得 doNotify 中临界区的锁。当等待线程离开等待状态时,它必须重新获取锁。

但是,当doWait中的线程是运行,即在wait中没有阻塞时,它当然会持有该部分的当前锁,即myMonitorObject,这将阻塞 doNotify.

中的另一个线程

你可以想象wait是一个线程离开临界区,释放锁,让其他人获得锁的点,也是线程必须进入临界区的入口点重新为其获取锁,涉及阻塞