マルチスレッド プログラミングを行っているときに、有線の問題が発生しました。オブジェクトの更新は、別のスレッドで部分的にしか表示されません。擬似コードは次のとおりです。
初期状態: スレッド A が実行中で、スレッド B がブロックされている
Class C {
public int i;
public String s;
}
スレッド A:
...
// c is an object of class C and is accessible by both thread A and B
c.i = 10;
c.s = "success";
wakeup thread B:
スレッド B:
// after wakeup
assert(c.i == 10);
assert(c.s.equals("success"));
問題は次のとおりです。スレッド B では、文字列 cs の値が実際には null になることがあります。しかし、私はそれが「成功」という価値を持つことを期待しています。一方、アサート ステートメントの前に Thread.sleep(sometime) を配置すると、cs の期待値が表示されますが、なぜそれが発生するのかわかりません。
フィールド変数 s を volatile として宣言しようとしましたが、役に立ちません。
ありがとう!
更新 すべての返信/回答に感謝します。さらに実験と調査を行った結果、使用しているフレームワークのバグであると確信しています。フレームワークはスレッドの一時停止/再開を管理し、多数の同時要求/接続 (10k スレッドなど) があると混乱します。