• # 单例模式


    单例模式

    方式七种

    其中

    饿汉 –> 饿汉变种--> 静态内部类

    懒汉 线程不安全 --> 懒汉 线程安全–> 双重校验锁

    枚举法 网上最推荐的。stackoverflow 上点赞最多的….因为双重校验锁有反射存在的问题

    关键单词

    instance

    enum

    synchronized

    应该先从饿汉模式开始看, 线程安全。

    饿汉 ,

    // #饿汉 
    public class Singleton{
    	private  static Singleton instance=new Singleton();
    	private Singleton(){}
    	public static Singleton getInstance(){
    		return instance;
    	}
    }
    

    这两种没什么区别,只不过放在了 静态块

    //# 饿汉变种
    public class Singleton{
    	private Singleton instance=null;
    	static{
    		instance=new Singleton();
    	}
    	private Singleton(){}
    	public static Singleton getInstance(){
    		return this.instance;
    	}
    }
    

    内部静态类

    //【推荐】5 静态内部类,前两种是只要singleton 被装载,那么instance就被实例化
    // 而这种方法使用调用getInstance 才会被装载,从而实例化instance。
    //目的,实例化instance 消耗资源大,希望延迟加载
    public class Singleton{
    	private static class SingletonHolder{
    		private static  final Singleton INSTANCE=new Singleton();
    	}
    
    	private Singleton(){}
    	public static final Singleton getInstance(){
    		return SingletonHolder.INSTANCE;
    	}
    }
    
    

    饿汉式

    // #懒汉 线程不安全
    public class Singleton{
    
    	private static Singleton instance;
    	private Singleton(){}
    
    	public static Singleton getInstance{
    		if(instance == null){
    			instance=new Singleton();
    		}
    		return instance;
    	}
    }
    
    // #懒汉 线程 安全  效率低
    
    public class Singleton{
    	private static Singleton instance;
    	private Singleton(){}
    	public static synchronized Singleton getInstance{
    		if(instance==null){
    			instance=new Singleton();
    		}
    		return instance;
    	}
    }
    
    
    //【推荐】 双重校验锁
    public class Singleton{
    	private static Singleton instance=null;
    	private Singleton(){}
    	public static final Singleton getInstance(){
    		if(instance==null)
    		{
    			synchronized(Singleton.class)
    			{
    				if(Singleton==null)
    					instance=new Singleton();
    			}
    		}
    	}
    }
    
    //双重校验锁仍然是有缺点的,极力推荐 enum法
    //https://www.jianshu.com/p/1f856daa39c7
    

    枚举

    //【推荐】6 、  大神 枚举法 !!!  可以避免 多线程同步问题,还能防止反序列化重新创建对象
    public enum Singleton{
    	INSTANCE;
    	public void whaterverMethod(){
    	}
    }
    //因为JVM会保证enum不能被反射并且构造器方法只执行一次。
    //https://837062099.iteye.com/blog/1454934
    //枚举的本质 是枚举 对象! ,http://c.biancheng.net/view/1100.html
    
    //https://www.cnblogs.com/alter888/p/9163612.html
    //枚举实现原理 , 会生成相关的类,集成
    
  • 相关阅读:
    实验:缓冲区溢出
    树莓派4B安装和使用openEuler系统
    stat命令的实现-mysate
    20191310Lee_Yellow第五章读书笔记
    反汇编测试
    openssl编程
    Openeuler安装完整man手册
    20191310Lee_yellow缓冲区溢出实验
    《奔跑吧!树莓派》实验指导第三章
    20191310李烨龙第四章读书笔记
  • 原文地址:https://www.cnblogs.com/EsMussSeinHui/p/11201352.html
Copyright © 2020-2023  润新知