volatile
インスタンス変数の読み取り/書き込みが2つあり、ロックを解除するオーバーヘッド(または潜在的なデッドロックのリスク)が必要ない場合は、インスタンス変数を使用することがあります。たとえば、タイマースレッドは、あるクラスでゲッターとして公開されているintIDを定期的に更新します。
public class MyClass {
private volatile int id;
public MyClass() {
ScheduledExecutorService execService = Executors.newScheduledThreadPool(1);
execService.scheduleAtFixedRate(new Runnable() {
public void run() {
++id;
}
}, 0L, 30L, TimeUnit.SECONDS);
}
public int getId() {
return id;
}
}
私の質問:JLSが32ビット読み取りがアトミックであることを保証するだけだとすると、揮発性のlongを使用することに意味はありますか?(つまり、64ビット)。
警告volatile
: overの使用synchronized
は事前最適化の場合であると言って返信しないでください。いつどのように使うかはよく知っていますが、望ましいsynchronized
場合もあります。volatile
たとえば、シングルスレッドアプリケーションで使用するSpring Beanを定義する場合volatile
、Springコンテキストがメインスレッドで各Beanのプロパティを初期化する保証がないため、インスタンス変数を優先する傾向があります。