单例模式的特点是 一个对象只有一个实例。可以用于系统全局变量的设置。
实现思路:
利用的是private 方法只能类本身调用。因此把构造方法声明为private,只能通过类内部的public static方法来声明该类的实现(如果不声明为static,则无法调用,变成先有鸡还是先有蛋的问题了),并用一个该类型的static变量来保存该类的唯一实例。
注意:
使用单列模式应该注意线程安全问题,可以改进成线程安全的单例。
使用类加载器,同样会创建多个实例
实现:
package singleton;
public class Singleton {
private static Singleton instance;
private Singleton() {
}
//延迟实例化,线程不安全
public static Singleton getInstance() {
if(instance==null){
instance=new Singleton();
}
return instance;
}
//带线程锁的延迟实例化,可以确保线程安全,但效率低下,即使实例存在,还是会调用线程锁
//如果对调用此方法导致的效率问题不是很关心,则可以保持
/* public static synchronized Singleton getInstance() {
if(instance==null){
instance=new Singleton();
}
return instance;
}*/
//急切实例化,线程安全
//private static Singleton instance=new Singleton();
/*
public static Singleton getInstance() {
return instance;
}
*/
}
双重检验法
package singleton;
public class DoubleCheckSingleton {
//volatile确保多线程时,正确使用实例。确保共享变量的可见性。
private volatile static DoubleCheckSingleton instance;
private DoubleCheckSingleton() {
}
public static DoubleCheckSingleton getInstance(){
if(instance==null){
synchronized (Singleton.class){ //对象全局锁
if(instance==null){
instance=new DoubleCheckSingleton();
}
}
}
return instance;
}
}
网友评论