设计模式-单例模式
2021-08-09 本文已影响0人
JAY_DaYin
单例模式
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
1.懒汉式 --- 静态常量方式 (线程安全)
public class Singleton{
private static Singleton instance=new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return instance;
}
}
2.饿汉式 --静态代码块方式 (线程安全)
public class Singleton{
private static Singleton instance;
static{
instance=new Singleton();
}
public static Singleton getInstance(){
return instance;
}
}
3.懒汉式 (线程不安全)
public class Singleton{
private static Singleton singleton;
private Singleton(){}
public static Singleton getInstance(){
if(singleton==null){
singletion=new Singleton();
}
return singletion;
}
}
4.懒汉式(线程安全 ,方法上加同步锁)
获取实例的getInstance方法上加了同步锁,保证了多线程场景下的单例,效率会有折损
public class Singleton{
private static Singleton singleton;
private Singleton(){}
public static synchronized Singleton getInstance(){
if(singleton==null){
singleton=new Singleton();
}
return singleton;
}
}
5.双重校验锁(线程安全,效率高)
此种实现不用每次都需要获得锁,减少获得锁和等待的事件
注意的volatile 关键字的使用,保证了各线程对singleton 静态实例修改的可见性
public class Singleton{
public volatile static Singleton singleton;
private Singletion(){}
public Singleton getInstance(){
if(singleton==null){
if(synchronized(Singleton.class)){
if(slingleton==null){
singleton=new Singleton();
}
}
}
return singleton;
}
}
6.静态内部类实现单例 (线程安全,效率高)
这种方式Singleton 类被装载了,Instance 不一定被初始化,因为SingletonHolder 类没有被主动使用,只有通过显式调用getInstance 方法时,才会显式装载SingletonHolder类,从而实例化inatance;
注意内部类SingletonHolder 要同static 进行修饰其中的静态变量INSTANCE 必须是final的
public class Singleton{
public class SingletonHolder{
public static final Singleton INSTANCE=new Singleton();
}
private Singeton(){}
public static final Singletion getInstance(){
return SingletonHolder.INSTANCE;
}
}