在我的应用程序中,服务器类在启动时加载,所有数据都缓存一次。
它是一个单例类,它的实例变量不是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 的文章和 Q/A 之后,我认为 volatile 会使数据再次加载,因为 volatile 使信息从内存中读取而不是从缓存中读取。
那么我应该让我的变量变易变吗?
如果不稳定,那么我是否必须一次又一次地加载我的数据?
最佳答案
通常认为创建线程安全单例的最安全方法是将其设为枚举...
public enum Server{
INSTANCE;
public Server getInstance(){
return INSTANCE;
}
private Server(){...}
// rest of methods here
}
关于java - 其实例为 volatile 的 Singleton 类是否使实例数据再次加载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19025801/