单例
单例是划分在创建型设计模式之中,全局唯一实例,在实际使用过程中出现比较多,例如文件加载后的缓存…
实现方式
1.饿汉式
类加载的实时初始化,JVM保证了类加载时不会出现多线程的情况。
publlic class Singleton{
//私有构造器,外界不可new调用
private Singleton(){}
//静态属性,在类初始化阶段就创建实例赋值,类加载保证线程唯一
private static Singleton single = new Singleton();
//获取方法
public static Singleton getSingleton(){
return single;
}
}
缺点就是浪费空间
2.饱汉式
public class Singleton{
//私有构造器,外界不可new调用
private Singleton(){}
//静态属性,volatile 可以防止缓存,直接从内存读取
private static volatile Singleton single = null;
//获取方法
public static Singleton getSingleton(){
if(single == null){
//并发可能发生的地方
synchronize(Singleton.class){
if(single == null){
single = new Singleton()
}
}
}
return single;
}
}
双重检测锁机制,如果在getSingleton方法上加锁,性能是一个缺陷。
3.嵌套类
public class Singleton{
//私有构造器,外界不可new调用
private Singleton(){}
//静态内部类
private static class InnerSingleton{
private static Singleton single;
static{
single = new Singleton();
}
}
//获取方法
public static Singleton getSingleton(){
return InnerSingleton.single;
}
}
4.枚举类
枚举是由JVM控制的,所以天生保证了单例的特性。