3

何か変なことが起きています。同期ブロックに入ると、スレッドの名前を出力しようとします。出力ステートメントの後、100000 秒のハッジポーズをとります。

@Override
public int getNextAvailableVm() {
    synchronized(this) {

        System.out.println(Thread.currentThread().getName());

        try {Thread.sleep(100000000);}catch(Exception exc){}

        String dataCenter = dcc.getDataCenterName();
        int totalVMs = Temp_Algo_Static_Var.vmCountMap.get(dataCenter);
        AlgoHelper ah = (AlgoHelper)Temp_Algo_Static_Var.map.get(dataCenter);
        .
        .
        .
   }
}

ただし、このメソッドが実行されると、2 つのスレッドの名前が出力されます。

Thread-11
Thread-13

この後、長い一時停止が発生します。何故ですか ?最初のスレッドがまだブロックを離れていないときに、2 つのスレッドが同期ブロックに入るにはどうすればよいでしょうか?

4

3 に答える 3

6

2 つのスレッドが同じオブジェクトに対して実行されている場合、これは発生しません。

したがって、スレッドごとに新しいオブジェクトを作成するか、少なくともいくつかのスレッドを異なるオブジェクトで実行することをお勧めします。

複数のオブジェクトが必要な場合は、を使用しないでください。 tosynchronized(this)を作成する必要があります。壊れるので同期しないでください。static final Objectsynchronizethis.getClass()

于 2013-09-09T10:58:07.367 に答える
1

ほとんどgetNextAvailableVm()の場合、含まれているクラスの異なるインスタンスを呼び出しています。同期しているためthis、2 つの異なるモニターでロックされます (最初のスレッドはインスタンス 1 でロックされ、2 番目のスレッドはインスタンス 2 でロックされます)。

これを修正する方法はたくさんあります。

  • メソッド全体を作るsynchronized
  • 同期するthis.getClass()
  • ロックする静的オブジェクトを定義する
  • java.util.concurrent.locks のメソッドを使用してロックを行う

これらは問題に対処するためのいくつかの提案にすぎませんが、適切な問題を見つけるには、アプリケーションの構造と要件について詳しく知る必要があります。

于 2013-09-09T11:00:03.957 に答える
0

以下のプログラムは、あなたが期待したように動作すると思います。

Thread1.Class でロックされているため、2 つのスレッドが同時にメソッドを実行することはありません

public class Test {
    public static void main(String [] args) { 
        Thread1 t1 = new Thread1();
        Thread1 t2 = new Thread1();
        t1.start();
        t2.start();
    }
}

class Thread1 extends Thread{
    public void run(){
        getNextAvailableVm();
    }
    public void getNextAvailableVm() {
        synchronized(Thread1.class) {
            System.out.println(Thread.currentThread().getName());
            try {
                Thread.sleep(1000);
                }catch(Exception exc){}
            System.out.println(Thread.currentThread().getName());
        }

    }
}

OUTPUT スレッド 1 スレッド 1 スレッド 0 スレッド 0

于 2013-09-09T11:00:12.810 に答える