3

私はJavaスレッド(同期とロック)について学んでいましたが、どういうわけか、これら2つの違いを見つけることができませんでした。

// Two different instances of SyncExample
Thread a1 = new Thread(new SyncExample(), "A");
Thread b1 = new Thread(new SyncExample(), "B");

// Same instance is passed to both the threads
SyncExample syn = new SyncExample();
Thread a2 = new Thread(syn, "A");
Thread b2 = new Thread(syn, "B");

// I believe in total 4 stacks are built.
a1.start();
b1.start();

a2.start();
b2.start();

public class SyncExample implements Runnable {

    Object obj = new Object();

    @Override
    public void run() {

        this.myName();
    }

    private void myName() {

        synchronized (obj) {
            System.out.print("Define" + Thread.currentThread().getName());
            try {
                Thread.sleep(500);
            } catch (InterruptedException ex) {
                System.out.println(ex);
            }
            System.out.print("tly" + Thread.currentThread().getName());
        }
        System.out.println(" Maybe" + Thread.currentThread().getName());
    }
}


public class SyncExample implements Runnable {

    Object obj = new Object();

    @Override
    public void run() {

        this.myName();
    }

    private void myName() {

        synchronized (obj) {
            System.out.print("Define" + Thread.currentThread().getName());
            try {
                Thread.sleep(500);
            } catch (InterruptedException ex) {
                System.out.println(ex);
            }
            System.out.print("tly" + Thread.currentThread().getName());
        }
        System.out.println(" Maybe" + Thread.currentThread().getName());
    }
}

しかし、ここでの問題は、この例を使用して実行する場合です。

1-同じ参照出力は次のとおりです。

DefineAtlyA MaybeA
DefineBtlyB MaybeB

2-2つの異なるインスタンス:

DefineADefineBtlyAtlyB MaybeB
 MaybeA

実行可能なターゲットをスレッドクラス1に渡すとどのような違いが生じるかを説明できますか?同じインスタンス2.異なるインスタンス

4

2 に答える 2

2

コードでは、(SyncExampleクラスの)2つの異なるインスタンスを渡すと、各インスタンスに独自のロックオブジェクト(変数によって保持されるobj)があります。2つの異なるロックオブジェクトがあるため、各スレッドはロックを取得して並行して実行され、スレッドAとB(DefineADefineBtlyAtlyB MaybeB MaybeA)のインターリーブされた出力になります。

一方、同じインスタンスを渡す場合、SyncExampleクラスのインスタンスは1つだけです。その結果、ロックオブジェクトのインスタンスは1つだけになります(変数によって保持されますobj)。したがって、このロックオブジェクトは2つのスレッド間で共有されます。この共有により、1つのスレッド(たとえばT1)のみが同期ブロックに入ることができます。もう一方のスレッド(たとえばT2)は、T1が同期ブロックが存在するまで待機します。したがって、実行では、最初にスレッドAのすべてのprintステートメントが表示され、次にスレッドBのすべてのステートメントが表示されます(DefineAtlyA MaybeA DefineBtlyB MaybeB)。

これを一般化すると、異なるインスタンスを渡すと、静的変数のみがスレッドの並列実行に影響しますが、単一のインスタンスを渡すと、静的変数とクラスレベル変数(objコード内の変数など)の両方が影響しますスレッドの並列実行に影響します。

于 2013-03-04T07:36:42.600 に答える
1

出力は違いを示唆するはずです。

同じスレッドを2つの異なるスレッドに渡すと、SyncExampleそのうちの1つだけがロックを取得して、ブロックobj内のコードを実行できます。synchronized

2つの異なるオブジェクトを渡すと、異なるSyncExampleオブジェクトで同期しているため、両方のスレッドを同時に実行できます。

于 2013-03-04T06:27:22.137 に答える