单例模式:确保一个类只有一个实例,并提供一个全局访问点。当你需要实例时,向类查询,而不是自行new一个。
经典单例模式代码
public class Singleton{
private static Singleton singleton;
public static Singleton getInstance(){
if(singleton==null){
singleton=new Singleton();
}
return singleton;
}
}
上面单例模式的缺点,在多线程操作时很明显。
(1)采用了延迟实例化,下面是饥饿的实例化
public class Singleton{
private static Singleton singleton=new Singleton();
public static Singleton getInstance(){
return singleton;
}
}
(2)采用同步方法
public class Singleton{
private static Singleton singleton;
public static synchronized Singleton getInstance(){
if(singleton==null){
singleton=new Singleton();
}
return singleton;
}
}
(3)双重锁检查机制,在性能和安全之间的中和。
public class Singleton{
private volatile static Singleton singleton;
public static Singleton getInstance(){
if(singleton==null){
synchronized(Singleton.class){
if(singleton==null){
singleton=new Singleton();
}
}
}
return singleton;
}
}
小提示:类加载器可能有机会创建自己的单例。所以如果你的程序有多个类加载器又同时使用了单例模式,请自己指定类加载器。