如何在Java的单例设计模式中使用空检查以获得更好的性能
为了确保在多线程环境中只创建一个类实例,我们创建了一个具有以下结构的单例类如何在Java的单例设计模式中使用空检查以获得更好的性能,java,multithreading,singleton,null-check,Java,Multithreading,Singleton,Null Check,为了确保在多线程环境中只创建一个类实例,我们创建了一个具有以下结构的单例类 class Singleton { private volatile static Singleton _instance; private Singleton() { // preventing Singleton object instantiation from outside } public static Singleton getInstanceDC()
class Singleton {
private volatile static Singleton _instance;
private Singleton() {
// preventing Singleton object instantiation from outside
}
public static Singleton getInstanceDC() {
if (_instance == null) {
synchronized (Singleton.class) {
if (_instance == null) {
_instance = new Singleton();
}
}
}
return _instance;
}
}
但是,有没有一种方法可以提高类的性能,即在从静态函数中获取对象之前,在执行
空检查时,每个线程必须支付的惩罚?这就是所谓的过早优化。您实际上并不知道空检查导致了问题(相信我,事实并非如此)。空检查的成本约为纳秒
只有在发现确实存在问题之后,才需要担心性能。然后,进行一些分析,以确定导致问题的代码部分,不要优化那些“看起来”可能是问题的东西,因为没有性能统计数据来支持这种看法。根据Josh Bloch的说法。有效的Java第二版,自Java1.5以来,这是最好的方法
public enum Singelton {
INSTANCE;
}
即使在复杂的序列化或反射攻击中,它也是安全的
但始终要记住,单身汉捍卫可测试性。
虽然您的问题中的单例可以使用反射重置为测试目的,但我的答案中的单例可能无法重置
因此,我建议您仔细考虑是否需要单例,我总是避免使用它们。单例的最佳方法是尽早实例化,除非有资源限制的原因
public class Singleton
{
//guaranteed thread safe
private static final Singleton _instance = new Singleton();
public static Singlegon getInstance()
{
return _instance;
}
}
空检查非常便宜。这不是我会担心优化的问题,即使有可能优化,我对此表示怀疑。特别是,CPU在优化几乎总是以相同方式进行的if检查方面非常出色,而这一次将是如此。这基本上是免费的,你真的应该找点别的事来担心。难道你不能静态初始化\u实例
,而不是在第一次访问时创建它吗?这样,您就不需要在每次访问时检查null。请参阅有效的Java第二版Thank@Jim,即使我知道同样的事情,它也不会影响性能。但这是一位非常资深的开发人员在采访中提出的问题之一,我无法回答。