1

Synchronization メソッドを使用してサンプル スレッド モジュールを実行しようとしていますが、期待どおりの結果が得られません。

m1() を同期したので、thread-1 が値 0...10 を完全に出力してから、thread-2 が実行を開始すると予想されます。

しかし、この場合、数字は交互に印刷されます...

package threadexample;

public class Test implements  Runnable{
    public void run(){
        m1();
    }
    public synchronized void m1(){
        for (int i = 0; i < 10; i ++){
            System.out.println(Thread.currentThread().getName() + " Value of i = " + i);
        }
    }
    Test(String threadname){
        super();
    }

    public static void main(String[] args){
            Test a = new Test("A");
            Test b = new Test("B");
            Thread t1 = new Thread(a);
            Thread t2 = new Thread(b);
            t1.start();
            t2.start();

    }   

}



Output:

Thread-0 Value of i = 0
Thread-1 Value of i = 0
Thread-0 Value of i = 1
Thread-1 Value of i = 1
Thread-0 Value of i = 2
Thread-1 Value of i = 2
Thread-0 Value of i = 3
Thread-1 Value of i = 3
Thread-0 Value of i = 4
Thread-1 Value of i = 4
Thread-0 Value of i = 5
Thread-1 Value of i = 5
Thread-0 Value of i = 6
Thread-1 Value of i = 6
Thread-0 Value of i = 7
Thread-1 Value of i = 7
Thread-0 Value of i = 8
Thread-1 Value of i = 8
Thread-0 Value of i = 9
Thread-1 Value of i = 9
4

2 に答える 2

3

synchronizedインスタンスメソッドがあります。インスタンス自体で同期されます。ただし、それぞれがThread異なるインスタンスを使用しています。それらはそれぞれsynchronized異なるオブジェクト上にあるため、互いにブロックしません。

Testインスタンスを共有する必要があります

Test a = new Test("A");
Thread t1 = new Thread(a);
Thread t2 = new Thread(a);

またはsynchronized別の共有オブジェクトで使用します。これを行うには、ロック オブジェクトをコンストラクター引数として渡すか、静的フィールド参照を使用します。

于 2013-09-27T00:24:53.247 に答える