いくつかのOSSユニットテストでこのコードを頻繁に参照していますが、スレッドセーフですか? whileループはinvocの正しい値を見ることが保証されていますか?同期化されていないため、javaの整数スレッドセーフが読み込まれますか?
いいえ。誰が誰がどのCPUアーキテクチャが失敗するかを知っている人を指摘する。
private int invoc = 0;
private synchronized void increment() {
invoc++;
}
public void isItThreadSafe() throws InterruptedException {
for (int i = 0; i < TOTAL_THREADS; i++) {
new Thread(new Runnable() {
public void run() {
// do some stuff
increment();
}
}).start();
}
while (invoc != TOTAL_THREADS) {
Thread.sleep(250);
}
}
100%とは言えませんが、非揮発性フィールドの非同期読み出しは、(書き込み*が*によってフラッシュされていても)最新の値を読み込むことが保証されていないようです。 'increment()'メソッドの 'synchronized'キーワードを参照してください)。Javaメモリモデルは、確かに言えば十分に分かりません。 – dlev
@dlev質問です。) – krosenvold
「私はいつも働いてくれました!」と答えようとしていました。しかし、intsには "Yes"、longsとdoubleには "Maybe"と言うhttp://stackoverflow.com/questions/1006655/are-java-primitive-ints-atomic-by-design-or-by-accidentも見つかりました。 –