设计模式之单例模式

核心作用:保证一个类只有一个实例,并提供一个访问该实例的全局访问点
实现思路:懒汉式、饿汉式、双重检测锁、内部类式、枚举式

  • 懒汉式:直接声明一个私有的静态类成员,然后将其构造器私有化

    • 优点:线程安全,调用效率高
    • 缺点:不能实现预加载
    • 实现过程:
    public Class LazySingleClass{
        private static instance=new LazySingleClass();
        private LazySingleClass(){}    //构造器私有化
        public static LazySingleClass getInstance(){
            return instance;
        }
    }
    
  • 饿汉式:只是声明一个私有的静态类,但不进行初始化,第一次使用的时候进行初始化,要加上同步字段

    • 优点:线程安全,调用效率高,可以实现预加载
    • 缺点:
    • 实现过程:
     public Class HungrySingleClass{
         private static instance;
         private HungrySingleClass(){}
         public static HungrySingleClass getInstance(){
            if(instance==null){
                instance=new HungrySingleClass();
             } 
             return instance;
         }
     }
    
  • 双层检测锁

    • 优点:
    • 缺点:由于jvm优化的问题,在使用的过程中可能会出错
    • 实现过程
     /**
     * 双重检测锁
     * 该模式将同步加到了if后边提高了调用的效率,但是偶然会出现问题
     * @author Admain
     *
     */
    public class DoubleLock {
    private  DoubleLock() {	}
    private static DoubleLock instance;
    public static synchronized DoubleLock getInstance(){
    	//检测两次instance是否为null
    	if(instance==null){ //第一次检查
    	synchronized (DoubleLock.class) {
    		if(instance==null){
    			instance=new DoubleLock();//第二次检查
    		}
    		}	
    	}
    	return instance;
    }
    }
    }  
    
  • 内部类方式:通过内部类持有对象来实现单例模式

    • 优点:线程安全,调用效率高,可以延时加载
    • 代码实现
    public class StaticInnerClass {
    private StaticInnerClass(){}
    //内部类天然线程安全,没有同步代码块效率高
    private static class innerClass{
    	private static final StaticInnerClass instance=new StaticInnerClass(); 
    }
    public static StaticInnerClass getInstance(){
    	return innerClass.instance;
    }
    }  
    
  • 枚举方式实现:定义枚举类型,然后在枚举类体内添加需要的方法

    • 优点:利用了枚举天然单例的的特点,线程安全,调用效率高,可以延时加载
    • 代码实现:
    public enum EnumStyle {
    //则个枚举元素,本身就是一个单例模式,但是不能延时加载,可以天然防止反射和反序列化的漏洞
    instance;
    //添加自己所需要的操作
    public void operation(){
       System.out.println("操作单例对象");
    }
    }  
    
原文地址:https://www.cnblogs.com/goWithHappy/p/10671670.html