即使在使用synchronized()之后,字符串也没有按顺序显示

时间:2014-06-04 08:56:12

标签: java multithreading synchronized

我在观察此问题时试图了解同步功能。首先,这是代码 -

SampleThread04.java

public class SampleThread04 extends Thread
{
    public void disp(String s)
    {
        System.out.print("["+s);
        try
        {
            Thread.sleep(1000);
        }catch(Exception e){
            System.out.print(e);
        }
        System.out.println("]");
    }
}

SampleThread05.java

public class SampleThread05 implements Runnable
{
    SampleThread04 d;
    String s;
    Thread t;
    public SampleThread05(SampleThread04 d1, String s1)
    {
        s = s1;
        t = new Thread(this);
        d = d1;
        t.start();
    }
    public void run()
    {
        synchronized(d){
            d.disp(s);
        }
    }
}

ThreadDemo02.java

public class ThreadDemo02
{
    public static void main(String[] args)
    {
        SampleThread04 st4 = new SampleThread04();
        new SampleThread05(st4,"one");
        new SampleThread05(st4,"two");
        new SampleThread05(st4,"three");
    }
}

我在运行代码时获得了不同的输出。

输出#1:

[one]
[two]
[three]

输出#2:

[three]
[one]
[two]

输出#3:

[three]
[two]
[one]

等等。

不使用synchronized(),我得到以下输出 -

[one[two[three]
]
]

这是可以理解的但是为什么当我使用synchronized()时,字符串有时会在不使用它时按顺序打印我总是得到相同的输出。输出不应该总是如下 -

[one]
[two]
[three]

请解释字符串是如何按顺序打印的。提前致谢。 :)

1 个答案:

答案 0 :(得分:5)

synchronized语句只会导致disp方法作为一个整体执行。由于您为每个字符串启动一个新线程,因此无法控制首先执行哪个线程。虽然线程是按顺序启动的,但它们不会以相同的顺序完成。