正確な答えを出すには詳細が少なすぎます。すべての同期コードがビジネス ロジックから分離されるように、コードをリファクタリングします。次に、テスト中にビジネス ロジックをメソッドを呼び出すコードに置き換え、yeld()
volatile/atomic 変数を使用して、コードのこの時点で、この特定の時点で予想される数のスレッドがあるかどうかを確認できます。次に、任意の並行テスト フレームワークを使用します (私は multithreadedtc が好きです)。以下に、キューで同時操作を行うはずのアルゴリズムをテストするために使用した優先度キューの実装を示します
class YeldingHeap implements PriorityQueue<Integer> {
private AtomicInteger concurrentReads = new AtomicInteger();
private AtomicInteger concurrentWrites = new AtomicInteger();
@Override
public int size() {
read();
return 0;
}
@Override
public void insert(Integer element) {
write();
}
@Override
public Integer popMax() {
write();
return null;
}
private void write() {
int writes = concurrentWrites.incrementAndGet();
int reads = concurrentReads.incrementAndGet();
assertEquals(writes, 1, "more than 1 thread is writing");
assertEquals(reads, 1, "other thread is reading while this thread is writing");
Thread.yield();
writes = concurrentWrites.decrementAndGet();
reads = concurrentReads.decrementAndGet();
assertEquals(writes, 0, "more than 1 thread is writing");
assertEquals(reads, 0, "other thread is reading while this thread is writing");
}
private void read() {
concurrentReads.incrementAndGet();
int writes = concurrentWrites.get();
assertEquals(writes, 0, "other thread is writing while this thread is reading");
Thread.yield();
writes = concurrentWrites.get();
assertEquals(writes, 0, "other thread is writing while this thread is reading");
concurrentReads.decrementAndGet();
}
}