使用波动性多头有什么意义吗?
我偶尔会使用实例变量,如果我有两个线程从中读取/写入它,并且不希望取出锁的开销(或潜在的死锁风险);例如,一个计时器线程定期更新某个类上公开为 getter 的 int ID:volatile
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位读取将是原子的,那么使用易失性长线有什么意义吗?(即 64 位)。
注意:请不要回复说使用over是预优化的情况;我很清楚如何/何时使用,但在某些情况下是可取的。例如,在定义用于单线程应用程序的Spring Bean时,我倾向于使用实例变量,因为不能保证Spring上下文会在主线程中初始化每个Bean的属性。volatile
synchronized
synchronized
volatile
volatile