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

2 つの異なるロック オブジェクト (locklocko) を使用しているため、ブロックは相互に排他的ではありません。目的を達成するには、両方のブロックを同じロック オブジェクトで同期する必要があります。

于 2012-07-22T08:13:32.567 に答える
0

両方のスレッドが同じロック オブジェクト インスタンスを共有する必要があります。そうして初めて、目的の出力を得ることができます。

于 2012-07-22T08:14:46.343 に答える
0

同期するときは、オブジェクトの選択がすべて重要です。2 つのスレッドが対話する場合は、同じオブジェクトで同期する必要があります。

最も簡単な解決策は、使用することです

synchronized(System.out) {

出力を同期します。

于 2012-07-22T08:15:17.057 に答える
0

2 つ (またはそれ以上) のコード ブロックを同期するには、それらを同じオブジェクトで同期する必要があります。あなたの場合、オブジェクトは異なります。

于 2012-07-22T08:17:34.947 に答える