私は同時に50000000x4マトリックスを満たす4つのスレッドを持っています。書き込みの安全性を保証するために、私はポインタとしてAtomicIntegerを使用しました。各スレッドの各繰り返しは、ポインタ値をthreadPointerにコピーし、それを使用してaを埋めます。 ポインタ== buffer.lengthを取得する最初のスレッドは、バッファをメモリにフラッシュするルーチンを開始します。この時点の他のスレッドは、スレッドがそのジョブを終了するのを待つ必要があります。 これは私のコードです:Javaの待ち受けスレッド
if ((threadPointer = pointer.getAndAdd(1)) >= buffer.length){
synchronized (flag){
if(threadPointer == buffer.length){
sampledSelection();
pointer.set(0);
threadPointer = pointer.getAndAdd(1);
flag.notifyAll();
}else{
System.out.println("waiting");
flag.wait();
threadPointer = pointer.getAndAdd(1);
System.out.println("Awaken!");
}
}
}
私の問題はnotifyAll()
は、私はこの問題を解決することができthreads.How待機を復帰しないということでしょうか?あなたはそれを考え出したよう
'wait'呼び出しで[guarded blocks](https://docs.oracle.com/javase/tutorial/essential/concurrency/guardmeth.html)を使用していません。これは競合状態を可能にする。すなわち、あるスレッドが 'wait'呼び出しに到達しようとしているが、まだそれがない場合、別のスレッドは' notifyAll'をあまりにも早く呼び出して、それを永遠に待たせる。 –
私は参照してください。私のコードに予期しない動作を引き起こすバグがあることがわかりました。それらのうちの1つは、スレッドがnotifyAll()を呼び出す前に、あなたが書いたものを引き起こすことを期待しました。ありがとうございました。 – Aalto