在线程中使用同步关键字,但结果不正确?

时间:2015-11-04 10:42:38

标签: java multithreading

我试图使用关键字" synchronized"但结果不正确。我无法弄清楚为什么在第二个对象之前调用第三个对象。

预期产出:

hello
synchronized
world

输出 - 我得到的是

hello
world
synchronized

以下是我正在使用的代码:

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

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


class Caller implements Runnable{
   String msg;
   Callme target;
   Thread t;
   public Caller(Callme targ, String s){
      target=targ;
      msg=s;
      t=new Thread(this);
      t.start();
    }

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

}
 class Synch{
 public static void main(String[] args){
    Callme target=new Callme();
    Caller c1=new Caller(target,"hello");
    Caller c2=new Caller(target,"Synchronized");
    Caller c3=new Caller(target,"world");

try{
   System.out.println("Waiting for the threads to end");
   c1.t.join();
   c2.t.join();
   c3.t.join();
   }catch(InterruptedException ie){} 

   }    
 }

2 个答案:

答案 0 :(得分:5)

你正在开始三个主题。其中每个都会在call上调用Callme,因此一次只有一个线程将执行call ...但这并不意味着线程将在命令你开始它们。

想象一下,你开始一场跑步比赛,在赛道中途,你有一个门,一次只能有一个人通过。你几乎在同一时间开始10个跑步者 - 你为什么期望跑步者以你开始时的顺序进入大门?

基本上,同步提供排他性 - 它没有指定排序

答案 1 :(得分:-1)

Synchronized关键字用于获取该方法对象的锁定,并在方法返回时释放它,因此一次只有一个线程可以使用该方法。并且每次都没有必要获得相同的结果,它可能会根据线程的CPU可用性产生不同的结果。

您应该阅读有关多线程的更多信息

这是a link