Недавно я увидел один пример ниже. Я не могу понять, как основной и пассажирский потоки могут оставаться в синхронизированном блоке одновременно?Синхронизированные методы - как это работает?
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();
}
}
}
Вывод этой программы
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
, и это означает, что, когда основной поток печататься «пассажир ждет автобуса я нахожусь в синхронном методе» он был уже в синхронизированный блок и ждать. И следующий напечатанный текст - «wait ... я синхронизирован», что означает, что пассажирский поток также попал в его синхронизированный блок. Помните, что оба синхронизированных блока имеют один и тот же объект - p
как объект блока. Это кажется запутанным, поскольку я понимаю, что когда основной поток ввел блок synchronized(p)
, основной поток должен был заблокировать объект p
и по определению ни один другой поток не может получить доступ или ввести какой-либо синхронизированный блок или метод объекта p
!
Какую роль вы не понимаете? Таким образом мы будем атаковать эту проблему, а не объяснять всю программу. –