Java线程同步

时间:2015-07-27 17:18:31

标签: synchronization

Java有两种方法可以实现同步。当我在方法之后使用 synchronized关键字时,我的代码给出了正确的答案,但是当我使用 synchronized块时,我输错了输出。这是给出错误输出的代码。 我使用eclipse IDE编译并运行此代码。

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();
    }

}

}

1 个答案:

答案 0 :(得分:0)

我已经尝试过您提供的代码示例并且工作正常。当您使用线程时,要记住线程可以按任何顺序运行并且它不在控制之外,即,我们每次都不能期望相同的输出。对于每次运行,您可能获得相同的输出或不可能。它是用java设计的。这是你期待的还是其他任何东西。