1

リストがあります:

ArrayList リスト = 新しい ArrayList<>();

最初のスレッドで要素を追加します (高速です - 30/秒)。2 番目のスレッドで、そのサイズを読み取り、ファイルに出力します。

最初のスレッド:

synchronized(list){
    list.add(PlayerPosition);
}

2 番目のスレッド:

synchronized(list){
if(list.size()>0)
    out.print(list.size() + " ");
}

これはファイルの出力で、一部のみです: 1 1 1 3 3 5 4 6 7 7 9 11 8 9 12 10 14 16

それは間違っています。なぜなら、それは増加するだけだからです。1 1 1 はありえますが、11 8 はありえません。

私のプログラムは大きいですが、これらはこのリストの出現のみです (デバッグのためにコードの半分を削除しました)。list.remove()アプリ全体に等はありません。

質問があります。このように動作する可能性はありますか? そうでない場合は、コードのどこかに私の責任があります。

ええ、私は CopyOnWriteArrayList で試しました - 同じことです。ありがとう!

4

2 に答える 2

1

print期待した順序で s が実行されていない可能性があります。2 番目のスレッドのコードを次のように変更します。

synchronized(list){
    if (list.size() > 0) {
        synchronized (out) {
            out.print(list.size() + " ");
            out.flush();
        }
    }
}

端末(またはファイルなど)に文字を書き込んOutputStreamでいます。同期outとフラッシュを行わないと、スレッド 2 がOutputStreamに印刷を指示したときに、前の印刷がまだ完了していない可能性があります。同期とフラッシュにより、スレッド 2 は、続行する前に、すべての文字が実際に端末に書き込まれるまで待機することになります。

于 2015-12-28T21:49:00.677 に答える