2015-07-27 7 views
0

Java имеет два способа реализовать синхронизация. Мой код дает правильный ответ, когда я использую синхронизированное ключевое слово после метода, но дает мне неправильный вывод, когда я использую синхронизированный блок. Вот код, который дает мне неправильный вывод. Я использовал eclipse IDE для компиляции и запуска этого кода.Синхронизация потоков Java

package synchronizedPackage; 

public class Synch1 { 

public class callMe { 

    void call(String msg) 
    { 
     System.out.print("[ "+msg); 

     try{ 
      Thread.sleep(1000); 
     }catch(InterruptedException e) 
     { 
      e.printStackTrace(); 
     } 
     System.out.println("]"); 
    } 
} 

public class caller implements Runnable{ 
    Thread t; 
    callMe target; 
    String msg; 

    public caller(callMe targ, String msg) 
    { 
     target = targ; 
     this.msg = msg; 
     t = new Thread(this); 
     t.start(); 
    } 

    @Override 
    public void run() { 
     synchronized(target) 
     { 
      target.call(msg); 
     } 

    } 

} 

public static void main(String[] args) { 

    Synch1 s = new Synch1(); 
    callMe target = s.new callMe(); 
    caller ob1 = s.new caller(target, "Hello"); 
    caller ob2 = s.new caller(target, "Synchronized"); 
    caller ob3 = s.new caller(target, "world"); 

    try{ 
     ob1.t.join(); 
     ob2.t.join(); 
     ob3.t.join(); 
    }catch(InterruptedException e) 
    { 
     e.printStackTrace(); 
    } 

} 

} 

ответ

0

Я пробовал образец кода, предоставленный вами И он отлично работает. Поскольку вы работаете с потоками 1, чтобы помнить, что потоки могут быть запущены в любом порядке, и он не находится под контролем, т. Е. Мы не можем ожидать того же выхода каждый раз. Для каждого запуска вы можете получить тот же результат или, возможно, нет. Он разработан в java, как это. Это то, чего вы ожидаете или что-то еще.

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