zoukankan      html  css  js  c++  java
  • # 单例模式

    单例模式

    方式七种

    其中

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

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

    枚举法 网上最推荐的。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
    //枚举实现原理 , 会生成相关的类,集成
    
  • 相关阅读:
    宏定义中的常见使用
    VS 对于LINK fatal Error 问题 解决方案
    cocos2d-x中常见的场景切换
    给新建的Cocos2d-x 3.X的Win32工程添加CocoStudio库
    2048之军衔篇 反馈 有事留言
    http 错误代码表
    华为S5700交换机初始化和配置SSH和TELNET远程登录方法
    Linux修改网卡名
    Linux如何配置bond
    linux系统下如何挂载NTFS移动硬盘
  • 原文地址:https://www.cnblogs.com/EsMussSeinHui/p/11201352.html
Copyright © 2011-2022 走看看