public class Singleton {
private static Singleton uniqueInstance;
private Singleton() {}//只有Singleton类内才能调用
public static Singleton getInstance(){
if(uniqueInstance == null){ //延迟实例化
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
}
- 在多线程中使用
1.使用同步(只有在第一次执行此方法时,才真正需要同步,降低性能)
public class Singleton {
private static Singleton uniqueInstance;
private Singleton() {}//只有Singleton类内才能调用
//通过增加synchronized 关键字
public static synchronized Singleton getInstance(){
if(uniqueInstance == null){ //延迟实例化
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
}
2.使用急切(eagerly)创建实例,而不用延迟实例化的做法
public class EagerlySingleton {
//在静态初始化器中创建单件,保证了线程安全
private static EagerlySingleton uniqueInstance = new EagerlySingleton();
private EagerlySingleton() {}//只有Singleton类内才能调用
public static EagerlySingleton getInstance(){
return uniqueInstance;
}
}
3.使用“双重检查加锁”
public class Singleton {
private volatile static Singleton uniqueInstance;
private Singleton() {}//只有Singleton类内才能调用
public static Singleton getInstance(){ //检查实例,如果不存在,进入同步区域
if(uniqueInstance == null){
synchronized (Singleton.class) {
if(uniqueInstance == null){
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}
单例模式:确保一个类只有一个实例,并提供一个全局访问点