1

Javaでの並行性についての私の理解を行使しようとすると、ここに問題があります。メソッドAを実行する複数のスレッドとメソッドBを実行する1つのスレッドのみが存在する可能性があります(たとえば、A()が10回実行された場合。したがって、10回目にそのスレッドメソッドBを実行します。これが発生した場合、スレッドがAを実行するのをブロックし、すでにAを実行しているスレッドがBの残りを実行する前に完了することを許可する必要があります。また、Aのスレッドはそれ自体を待機しないでください。

編集:すべてのスレッドは最初にAで開始され、Bをいつ実行するかをチェックする外部メソッドがあります。

これまでの私の試みは次のようになります。

volatile Boolean lock = false; //false = threads in method A allowed to run, thread in method B otherwise
volatile Integer countOfA = 0;

void A(){
    boolean continue = false;
    synchronized(lock){
    if(lock == true){ //there is a thread in B, block threads in A
        lock.wait();

        increaseCountOfA();
        //do work
        decreaseCountOfA();

        if(countOfA == 0){ //this was the last thread that ran with lock
            lock = true;
            lock.notify(); //only the thread in B should be waiting on this
        }
      }else{
        continue = true;
      }
    }

    if(continue){
        increaseCountOfA();
        //do work;
        decreaseCountOfA();
    }
}

void B(){
  synchronized(lock){
    if(lock == false){
        lock.wait();
        if(countOfA > 0){
            countOfA.wait();
        }
        //do work;
        lock = false;
        lock.notifyAll();
    }
  }
}

void increaseCountOfA(){
  synchronized(countOfA){
    countOfA++;
  }
}

void decreaseCountOfA(){
  synchronized(countOfA){
    countOfA--;
  }
}

実行すると、ハングします。デッドロックが疑われます。また、この問題に必要な同期のレベルがいくつあるかわかりません。これは1つのレベルだけで実行できますか?

4

1 に答える 1

0

あなたがそうするとき、あなたは変数ではなく、synchronized(lock)によって参照されるオブジェクトで同期しています。lockおそらく、値を変更しない独立したロックオブジェクトが必要です。または、のような高レベルの同時実行クラスの使用を検討することもできますSemaphore

この場合、1つのスレッドが待機していてBoolean.TRUE、別のスレッドがに通知を投稿していBoolean.FALSEます。

于 2013-02-14T03:52:56.120 に答える