如何实现单例设计模式? 有更新!
众所周知,单例设计模式有以下几种方式.
(1).饿汉式;
(2).懒汉式(加同步锁的懒汉式、加双重校验锁的懒汉式、防止指令重排优化的懒汉式);
(3).登记式单例模式;
(4).静态内部类单例模式;
(5).枚举类型的单例模式。
1.什么是单例模式
单例模式(Singleton Pattern):确保一个类只有一个实例,并提供一个全局访问点。
2.如何实现一个单例模式?
2.1.实现代码
public class Singleton {
private static Singleton instance;
//构造器声明为私有,只有类内才可以调用构造器
private Singleton(){}
public static Singleton getInstance(){
if(instance==null){
synchronized (Singleton.class){
if(instance==null){
instance=new Singleton();
}
}
}
return instance;
}
}
2.2.为何加入synchronized关键字
上述实现代码中加入synchronized关键字来解决多线程实例化多个对象的问题,它也存在一些问题:
1. 同步锁会降低性能
2. 第一个if判断过于多余,是否可以不判断?减少计算
解决办法:
使用饿汉式
1、饿汉式:在程序启动或单例模式类被加载的时候,单例模式实例就已经被创建。
2、懒汉式:当程序第一次访问单件模式实例时才进行创建
2.如何避免被反射?如何避免被序列化?
反射在通过newInstance创建对象时,会检查该类是否ENUM修饰,如果是则抛出异常,反射失败。
jdk文档->枚举类:
https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html
3.是否有更好的解决方式?
4.枚举单例
public enum EnumSingleton {
INSTANCE();
private Map<String, Object> ss = new HashMap<String, Object>();
public void put(String key,Object value) {
ss.put(key, value);
}
public Object get(String key) {
return ss.get(key);
}
public static EnumSingleton getInstance() {
return INSTANCE;
}
private EnumSingleton() {
}
}
代码简单
5.有什么优点?
1.enum可以使我们代码量变的极其简洁
2.抵御反射
3.抵御序列化
4.减少不必要代码,减少不必要计算
评论
发表评论
|
|