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つのレベルだけで実行できますか?