【发布时间】:2013-09-26 10:32:16
【问题描述】:
在我的应用程序中,Server 类在启动时加载,所有数据都缓存一次。
它是一个单例类,它的实例变量不是 volatile 即
private static Server server;
findbug分析后,我要改成volatile,(如下图
public class Server {
private static volatile Server server;
public static Server getInstance(){
if(server == null){
synchronized (Server .class) {
if(server == null){
try {
server = new Server(....);
} catch (IOException e) {
Logger.logError(MODULE, "IO Error while creating server home location: " + strServerHome);
Logger.logTrace(MODULE, e);
}
}
}
}
return server;
}.......
}
但是在阅读了关于 volatile on stack 的文章和 Q/A 之后,我认为 volatile 会使数据再次被加载,因为 volatile 会从内存中读取信息而不是缓存。
那么我应该让我的变量不可变吗?
如果不稳定,那么我是否必须再次加载我的数据?
【问题讨论】:
-
我完全同意,但这是否意味着我必须再次加载数据,因为我的服务器实例不稳定
-
不,你对volatile的理解是完全错误的! volatile 只是指定线程如何使用字段,仅此而已。
标签: java synchronization singleton volatile