Почему не работает синхронизированный метод?

import static java.lang.System.out;

class Call{
  synchronized void call(String str,String name)  {
       out.print(name+" :");
       out.println("["+str+"]");
       try {
       Thread.sleep(500);
       }
       catch(InterruptedException e) {
          out.println("Ошибка");
       }
   }
}
class Caller implements Runnable{
    Call m;
    Thread t;
    String msg;
    String name;
    Caller(Call m,String msg,String name){
        t=new Thread(this,name);
        t.start();
        this.m=m;
        this.name=name;
        this.msg=msg;
    }
    public void run() {
        m.call(msg,name);
    }
}
class One{
    public static void main(String[] args) {
        Call e=new Call();
        Caller a=new Caller(e,"Добро пожаловать","Первый поток");
        Caller b=new Caller(e,"в мир","Второй поток");
        Caller c=new Caller(e,"синхронизации","Третий поток");
         try {
              a.t.join();
              b.t.join();
              c.t.join();
               }
               catch(InterruptedException l) {
                   out.println("Ошибка");
       }
    }
}

Ответы (1 шт):

Автор решения: Artem Berezovski

Дополню ответ @Mister_Jesus. Когда поток выходит из synchronized метода, освобожденный монитор захватывается, рандомно (условно) выбранным, потоком. В вашем случае, если 1 поток, скорее всего, нормально отработает, то не факт, что следующим будет поток 2.

→ Ссылка