如何在 Java 的单例设计模式中使用 Null 检查以获得更好的性能
How to get ride of Null check in singleton design pattern in Java for better performance
为了确保在多线程环境中只创建一个 class 实例,我们创建了一个具有以下结构的单例 class。
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;
}
}
但是有没有一种方法可以提高 class 的性能,方法是在从静态函数获取对象之前,每个线程在执行 null check
时都必须付出代价?
这称为过早优化。您实际上 不知道 空检查导致了问题(它不是,相信我)。空检查的成本在纳秒级。
只有在确定确实存在真正的问题后才担心性能。然后,进行一些分析以确定导致问题的代码部分,不要优化 "look" 没有性能统计数据支持这种看法的问题。
根据乔什·布洛赫的说法。自 Java 1.5 以来的第二版有效 Java 这是最好的方法
public enum Singelton {
INSTANCE;
}
即使面对复杂的序列化或反射攻击也是安全的。
但请始终记住,单身人士捍卫可测试性。
虽然可以使用反射重置您问题中的 Singleton 以用于测试目的,但我的答案中的 Singleton 可能不能。
所以我建议三思是否需要单例,我总是避免它们。
Singleton 的最佳方法是尽早实例化,除非有某些资源限制的原因。
public class Singleton
{
//guaranteed thread safe
private static final Singleton _instance = new Singleton();
public static Singlegon getInstance()
{
return _instance;
}
}
为了确保在多线程环境中只创建一个 class 实例,我们创建了一个具有以下结构的单例 class。
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;
}
}
但是有没有一种方法可以提高 class 的性能,方法是在从静态函数获取对象之前,每个线程在执行 null check
时都必须付出代价?
这称为过早优化。您实际上 不知道 空检查导致了问题(它不是,相信我)。空检查的成本在纳秒级。
只有在确定确实存在真正的问题后才担心性能。然后,进行一些分析以确定导致问题的代码部分,不要优化 "look" 没有性能统计数据支持这种看法的问题。
根据乔什·布洛赫的说法。自 Java 1.5 以来的第二版有效 Java 这是最好的方法
public enum Singelton {
INSTANCE;
}
即使面对复杂的序列化或反射攻击也是安全的。
但请始终记住,单身人士捍卫可测试性。 虽然可以使用反射重置您问题中的 Singleton 以用于测试目的,但我的答案中的 Singleton 可能不能。
所以我建议三思是否需要单例,我总是避免它们。
Singleton 的最佳方法是尽早实例化,除非有某些资源限制的原因。
public class Singleton
{
//guaranteed thread safe
private static final Singleton _instance = new Singleton();
public static Singlegon getInstance()
{
return _instance;
}
}