在应用程序的生命周期中,对象只有一个实例的时候,就会使用单例设计模式。单例类总是在第一次被访问的时候完成实例化,直至应用程序退出之前都会使用同一个实例
在单例模式定义的过程中,需要注意两点:
(1)该类允许存在一个实例
(2)需要为该单一实例提供一个全局访问点
单例模式的实现方式
- 1.懒汉式:线程不安全
public class Singleton{
private static Singleton instance;
//构造函数私有化
private SingletonDemo1(){}
public static Singleton getInstance(){
if(instance==null){
instance = new Singleton();
}
return instance;
}
}
- 2.懒汉式 线程安全
public class Singleton{
private static Singleton instance;
private Singleton(){}
public static synchronized Singleton getInstance(){
if(instance==null){
instance = new Singleton();
}
return instance;
}
}
- 3.饿汉式
public class Singleton{
private static Singleton instance = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return instance;
}
}
- 4.饿汉式 静态块在类加载的时候就实例化instance
public class Singleton{
private static Singleton instance = null;
private Singleton(){}
static{
instance = new Singleton();
}
public static Singleton getInstance(){
return instance;
}
}
- 5.静态内部类
public class Singleton {
private static class SingletonHolder{
private static final Singleton instance = new Singleton();
}
private Singleton(){}
public static Singleton getInstance(){
return SingletonHolder.instance;
}
}
- 6.双重校验锁
public class Singleton{ //volatile修饰变量是为了防止指令重排序 private volatile static Singleton instance; private Singleton(){} public static Singleton getInstance(){ if(instance==null){ synchronized(Singleton.class){ if(instance==null){ instance = new Singleton(); } } } } }