实现单例模式的方式有静态内部类方式、饿汉模式、懒汉方式、枚举方式、双重检测锁方式等。就其中几种做简要记录。
1、静态内部类方式
/**
* 静态内部类实现
* 这个实现懒加载
* 效率高
* 线程安全
*/
public class Single01 {
private static class SingletonInstance{
private static final Single01 single = new Single01();
}
private Single01(){};
public Single01 getInstance(){
return SingletonInstance.single;
}
}
2、枚举
/**
* 枚举实现单例模式
* 天然单例模式,能防止被反射和反序列
* 缺点:没有延迟加载的功能
*/
public enum Singleton02 {
INSTANCE;
}
3、饿汉模式
/**
* 饿汉模式
* 类加载的时候创建单例,不会被多次创建
* 不存在并发创建多个实例的问题
*/
public class Singleton03 {
private Singleton03(){};
private static final Singleton03 instance = new Singleton03();
//提供一个公共的方法进行访问
public static Singleton03 getInstance(){
return instance;
}
}
4、懒汉模式
/**
* 懒汉模式
* 并不能保证线程安全
*如果用synchronized修饰的,又会效率低
*/
public class Singleton04 {
private Singleton04(){};
private static Singleton04 instance;
//提供一个公共的方法进行访问
public static Singleton04 getInstance(){
instance = new Singleton04();
return instance;
}
}
5、双重检测锁方式
/**
* 双重检测锁
* 能保证线程安全,但是效率低
*/
public class Singleton05 {
private Singleton05(){};
private static Singleton05 instance;
//提供一个公共的方法进行访问
public static synchronized Singleton05 getInstance(){
if(instance == null){
synchronized(Singleton05.class){
if(instance == null){
instance = new Singleton05();
}
}
}
return instance;
}
}