0

問題が発生しましたが、特定できませんでした。共有シングルトン Bean の並行性の問題のように見えますが、それは単なる仮説です。

このエラーをローカルで再現する方法が必要です。2 つのスレッドが同じ 1000 分の 1 秒で一緒に処理されたときにのみ表面化しました。デバッグモードで釣り上げることなく、これをローカルでテストする方法があるのではないかと思っています。

私たちのプロセスはとてもシンプルです。

トピック プロセスからオブジェクトを取得し、エンリッチしてから、トピックに公開する新しいオブジェクトを送信します。2 つのリスナー スレッドがあります。

使用された技術

  • IDE日食
  • LDAP トピック
  • コード Java/Spring
4

1 に答える 1

0

正確な答えを出すには詳細が少なすぎます。すべての同期コードがビジネス ロジックから分離されるように、コードをリファクタリングします。次に、テスト中にビジネス ロジックをメソッドを呼び出すコードに置き換え、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();
}

}
于 2012-05-10T16:35:51.937 に答える