0

好吧,我是 java 新手,在 java 线程中实现同步代码块时遇到问题。

class btstep extends Thread
{
    private static final Object lock = new Object();
    public void run()
    {
        synchronized(lock)
        {
            System.out.println("3 ");
            System.out.println("4 ");
        }
    }
}

class btevent extends Thread
{
    private static final Object locko = new Object();
    public void run()
    {
        synchronized(locko)
        {
            System.out.println("1 ");
            System.out.println("2 ");
        }
    }
}

public class Interleaving
{
    public static btevent bt = new btevent();
    public static btstep bs = new btstep();

    public static void main(String[] args)
    {
        bt.start();
        bs.start();
    }
}

这个程序的运行输出是

1
3
2
4

这不是我想要的。同步的代码块不再是串行的,它交错我想要的输出是

1
2
3
4

或者

3
4
1
2

我在程序中做错了什么?

4

4 回答 4

3

您正在使用两个不同的锁对象(locklocko),因此这些块不是互斥的。您需要两个块在同一个锁对象上同步以实现您想要的。

于 2012-07-22T08:13:32.567 回答
0

两个线程需要共享同一个锁对象实例,只有这样你才能实现你想要的输出。

于 2012-07-22T08:14:46.343 回答
0

同步时,对象的选择非常重要。如果你想让两个线程交互,它们必须在同一个对象上同步。

最简单的解决方案是使用

synchronized(System.out) {

同步您的输出。

于 2012-07-22T08:15:17.057 回答
0

要同步 2 个(或更多)代码块,它们必须在同一个对象上同步。在您的情况下,对象是不同的。

于 2012-07-22T08:17:34.947 回答