は、次のコードを考える:変数のスレッドセーフな設定(Java)?
public class FooBar {
public static volatile ConcurrentHashMap myConfigData = new ConcurrentHashMap();
}
public class UpdaterThread implements Runnable {
run {
//Query the Data from the DB and Update the FooBar config Data
FooBar.myConfigData = ConfigDataDAO.getLatestConfigFromDB();
}
}
スレッド-Classは、定期的にmyConfigData Membervariableを更新します(エグゼ5分ごと経由)。 「外部」スレッドのスレッドセーフ(アトミック)のmyConfigDataの設定ですか、またはすべての読み取りおよび書き込み操作をmyConfigData変数に同期させる必要がありますか?
EDIT:ConcurrentHashMapはスレッドセーフであるかどうか(javadocに準拠しています)ではなく、myConfigDataメンバー変数にConcurrentHashMap自体を設定するかどうかという問題です。この変数は、いくつかのスレッドによって "一度に"読み書きされるので、設定がアトミックかどうかということになります。私はこれが "Java参照変数の設定はアトミックかどうか"に一般化できると思います。
(。。私もこれは別の問題であると不可分とは何の関係もありません、それは揮発性行わ - 私の質問は - ではなく、「他のスレッドでの視認性」と事前発生関係)
@unknown:引用されたテキストはあなたの言うことを言っていません!!実際のところ、JLSの次の箇条書きは次のとおりです。「明示的な同期がない場合、インプリメンテーションは主メモリを任意の順序で更新することができます。驚きを避けるプログラマは明示的な同期を使用する必要があります。 " –
@unknown:OPのコードが安全である唯一の理由は、彼が変数を「volatile」と宣言したことだけです。 –
@Stephen 質問の主なポイントは割り当てのアトミック性に関するものだと思います。だから私はこの仕様の部分を引用した。 私が正しく理解していれば、このアトミック性は、volatileが使われなくても保証されます。 しかし、他のスレッドでは変数の更新が表示されず、「古い」参照が引き続き表示されることがあります。しかし、スレッドは "他のオブジェクトへの参照または破損した参照値"を決して参照しません。 – Wolfgang