Java 同步方法-这是如何工作的?

Java 同步方法-这是如何工作的?,java,thread-safety,synchronized,Java,Thread Safety,Synchronized,我最近看到了下面的一个例子。我无法理解主线程和副线程如何同时保持在同步块中 public class bus { public static void main(String[] args) throws InterruptedException { passenger p = new passenger(); p.start(); synchronized (p) { System.o

我最近看到了下面的一个例子。我无法理解主线程和副线程如何同时保持在同步块中

public class bus 
{
    public static void main(String[] args) throws InterruptedException 
    {
        passenger p = new passenger();
        p.start();
        synchronized (p) 
        {
            System.out.println("passenger is waiting for the bus, i am in synchronised method");
            p.wait();
            System.out.println("passenger  got notification");
        }
        System.out.println("after "+p.total+" time");
    }
}

class passenger  extends Thread 
{
    int total = 0;

    public void run() 
    {
        synchronized (this) 
        { 
            System.out.println("wait ....  i am in synchronised method");
            for (int i = 0; i <= 1000; i++)
            total = total + i;
            System.out.println("passenger  is given  notification call");
            notify();
        }
    }
} 
这意味着当主线程打印“乘客正在等待公交车,我在同步方法中”时,它已经在同步块中等待。打印的下一条语句是“wait….i in synchronized method”,这意味着乘客线程也进入了同步块。请记住,两个同步块与块对象具有相同的对象-
p
。这似乎令人困惑,因为据我所知,当主线程进入
synchronized(p)
块时,主线程必须阻止对象
p
,根据定义,没有其他线程可以访问或进入对象
p
的任何同步块或方法

主线程和副线程如何同时保持在同步块中

p.wait()
释放
p
上的锁,直到线程重新唤醒,因此,只要最多有一个线程没有等待,任何数量的线程都可以
p
上同步

发件人:

当前线程必须拥有此对象的监视器线程释放此监视器的所有权,并等待另一个线程通过调用
notify
方法或
notifyAll
方法通知正在等待此对象监视器的线程唤醒。然后线程等待,直到它可以重新获得监视器的所有权并恢复执行

主线程和副线程如何同时保持在同步块中

p.wait()
释放
p
上的锁,直到线程重新唤醒,因此,只要最多有一个线程没有等待,任何数量的线程都可以
p
上同步

发件人:

当前线程必须拥有此对象的监视器线程释放此监视器的所有权,并等待另一个线程通过调用
notify
方法或
notifyAll
方法通知正在等待此对象监视器的线程唤醒。然后线程等待,直到它可以重新获得监视器的所有权并恢复执行


你不懂的部分是什么?这样我们就可以解决这个问题,而不是解释整个程序。你不理解的部分是什么?这样我们就可以解决这个问题,而不是解释整个程序。@Mohitt,yw。快乐等待。@Mohitt,yw。快乐的等待。
passenger is waiting for the bus i am in synchronised method
wait ....  i am in synchronised method
passenger  is given  notification call
passenger  got notification
after 500500 time
public final void wait() throws InterruptedException