【问题标题】:Strings are not being displayed in order even after using synchronized()即使在使用 synchronized() 后,字符串也没有按顺序显示
【发布时间】:2015-05-12 22:45:41
【问题描述】:

当我发现这个问题时,我试图理解同步功能。首先,这是代码-

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]

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

【问题讨论】:

    标签: java multithreading synchronized


    【解决方案1】:

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

    【讨论】:

    • 你能推荐一种控制输出的方法吗?
    • 也就是说,您实际上并不关心线程执行的顺序,只希望结果按顺序排列。如果您希望方法调用按顺序执行,那么根本不要使用线程
    • @bilesh.g 如果您希望按顺序处理您的代码,请不要启动额外的线程。
    猜你喜欢
    • 2013-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-19
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    • 2015-06-10
    相关资源
    最近更新 更多