在线程中同步代码块的异常

时间:2012-07-22 08:08:17

标签: java multithreading synchronized

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

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 个答案:

答案 0 :(得分:3)

您正在使用两个不同的锁定对象(locklocko),因此这些块不是互斥的。您需要两个块在同一个锁对象上同步才能达到您想要的效果。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

同步时,对象的选择每个都很重要。如果您希望两个线程进行交互,则它们必须在相同的对象上进行同步。

最简单的解决方案是使用

synchronized(System.out) {

同步您的输出。

答案 3 :(得分:0)

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