2

私の理解では、Java で「同期ステートメント」を使用して、複数のスレッド間の干渉を停止しています。

今、次の式で expr の意味を理解しようとしています。

同期 (expr) { ステートメント }

ロック動作は expr オブジェクトに依存しているように見えるためです。

例えば

public class Sync extends Thread {
    static int [] arr = {0,1,2};
    Object lock = new Object();
    public static void main(String[] args){

        Sync ob1 = new Sync();
        Sync ob2 = new Sync();
        ob1.start();
        ob2.start();

    }
    @Override
    public void run() {
        synchronized (arr) {
            for(int i = 0;i < arr.length; ++i){
                try {

                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + " "  + arr[i]);

            }
        }

    }
}

上記の例で、同期ステートメント (同期 (arr) ) で「arr」オブジェクトを使用している場合、次のように一貫して期待される出力が得られます。
スレッド-0 0
スレッド-0 1
スレッド-0 2
スレッド-1 0
スレッド-1 1
スレッド-1 2

しかし、同期ステートメント (同期 (ロック)) で「ロック」オブジェクトを使用すると、次のような出力が得られます。

スレッド-0 0
スレッド-1 0
スレッド-0 1
スレッド-1 1
スレッド-0 2
スレッド-1 2

どちらの場合も出力が同じであってはなりません。

ありがとう、
シャンタヌ

4

1 に答える 1

3

arr Object本質的に静的であるため、両方のスレッドが同じ arr を共有します。ロックのinstance object場合、2 つのスレッドに 2 つの異なるインスタンスがあります。

したがって、ここで arr オブジェクトと同期すると、ロックを保持しているブロックに最初に入るスレッドはarr object実行を終了し、他のスレッドは最初のスレッドが終了するかロックを解放するまで待機します。

ロックオブジェクトの場合は完全に2つの異なるオブジェクト(2つのリソース)であるため、各スレッドは異なるリソースまたはオブジェクトのロックを保持するため、実行は並列になります。

于 2012-11-18T09:20:35.293 に答える