volatileキーワードを非プリミティブとしても使用するかどうかはわかりません。私は1つのスレッドによってセット/割り当てられ、別のスレッドによってアクセスされるクラスメンバーを持っています。このメンバをvolatile宣言する必要がありますか?java-volatileキーワード(非プリミティブの場合)
private /* volatile */ Object o;
public void setMember(Object o) {
this.o = o;
}
public Object getMember() {
return o;
}
ここで、setMember(...)は1つのスレッドから呼び出され、getMember()は別のスレッドから呼び出されます。
たとえば、ブール値の場合、答えは「はい」になります。
私はJava 1.4を使用していますが、この場合のメンバーは読み取り専用です。だから私はこのケースでは可視性を気にしているので、volatileキーワードについての私の質問です。
フィールドが参照するオブジェクトのメンバも、マルチスレッドアクセス用に設計されている必要があります。なぜそうであるのかについては、拡張することができますか? – jtkSource
@jtkSource:volatileはフィールドのみに影響しますが、フィールドには参照のみが含まれています。 volatileは、他のスレッドがその参照の更新を参照するようにしますが、参照されるオブジェクトがvolatileまたは同期を適切に使用しない場合、他のスレッドはそのオブジェクトのフィールドの更新を見ることができません。 –
念のため、揮発性変数がオブジェクトを参照する場合、不揮発性変数もvolatile宣言されたオブジェクトの文脈内で一貫した方法で 'visibile'にされませんか?これを「オブジェクト参照」とも呼ばれる他のオブジェクトが非揮発性の方法で存在する場合、それらのオブジェクトだけが一貫した状態で変数を参照する危険性がありますか?記憶に同じ物体の表現が2つある可能性はありますか? - 私の論理を混乱させるかどうかを教えてください。 – jtkSource