2013-04-26 3 views
1

Недавно я увидел один пример ниже. Я не могу понять, как основной и пассажирский потоки могут оставаться в синхронизированном блоке одновременно?Синхронизированные методы - как это работает?

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!

+0

Какую роль вы не понимаете? Таким образом мы будем атаковать эту проблему, а не объяснять всю программу. –

ответ

4

Как основные и пассажирские потоки остаются в синхронизированном блоке одновременно?

p.wait()релизы замок на p до нити вновь пробуждается, поэтому любое количество потоков может быть synchronized на p до тех пор, как в большинстве из них не ждет.

От Object's javadoc:

public final void wait() throws InterruptedException 

Текущий поток должен владеть монитором данного объекта. Нить освобождает владельца этого монитора и ждет, пока другой поток не будет уведомлять потоки, ожидающие на мониторе этого объекта, просыпаться либо путем вызова метода notify, либо метода notifyAll. Затем поток ожидает, пока он не сможет повторно получить право собственности на монитор и возобновит выполнение.

+0

спасибо Майку. Я понял. – Mohitt

+0

@Mohitt, yw. Счастливого ожидания. –

Смежные вопросы