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