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

    手写单例模式

    单例模式特征

    • 构造方法不对外开发的,一般是 private
    • 通过一个静态方法或者枚举返回单例类的对象
    • 注意多线程的场景
    • 注意单例类对象在反序列化时不会重新创建对象

    1. 饿汉 如果应用程序总是创建并使用单例实例或在创建和运行时开销不大 加载类 就加载 对象

    class Single {
    	private Single(){}
    	private static Single single= new Single();
    	public static Single getInstance(){
    	return single;
    }
    

    2. 懒汉 如果开销比较大,希望用到时才创建就要考虑延迟实例化 Singleton的初 始化需要某些外部资源(比如网络或存储设备)

    class single {
    	private Single(){}
        
        private static Single single = null;
        public static synchroized  Single getIntenance(){
            // 同步锁粒度太大
            if(single == null){
                single = new Single();
            }
            }
            return single;
        }
    }
    
    • 加 synchronized 是线程安全的,但是粒度太大
    • 双重检查校验 减小粒度
    class Single {
    	private Single(){}
    	private volatile static Single single= null;
    	public static Single getInstance(){
    	if ( single == null ) {
    		synchronized (Single.class) {//锁整个对象
    		if ( single == null ) {
    			single = new Single();
    			}
    		}
    	}
    	return single;
    	}
    }
    

    在我们 new 一个对象的时候

    1. single 实例分配对象
    2. 调用 Single 构造方法 初始化成员变量
    3. Single 对象 赋值给 single

    但是在汇编语言中 ,这三步会 指令重排,所以没办法保证在 赋值时已经 new了实例对象,会导致双重检查 失败 1.5 之后 多了一个关键字 volatile 禁止指令重排

    3.静态内部类 延迟加载 用到 对象才加载

    class Single{
        private Single(){}
        
        private static class SingleHandler{
            private static Single single = new Single();
        }
        
        public static Single getInstacne(){
            return Single.SingleHandler.single;
        }
    }
    

    4. 枚举 默认线程安全

    public class Single{
    	private Single(){}
        
        public enum SingleEnum{
            singleHandler;
            private Single single;
            private SingleEnum(){
                single = new Single();
        }
        
        public Single getSingle(){
            return single;
        	}
    	}
        public static Single getInstance(){
            return SingleEnum.singleHandler.getSingle();
        }
    }
        
    
    
  • 相关阅读:
    校验XX是否在有效期内
    Thymleaf js直接获取后台传过来的对象或者对象的属性以及map
    H5新特性之data-*
    Thymleaf中th:each标签遍历list如何获取index
    SpringBoot图片上传(三)——调用文件上传项目的方法(同时启动两个项目)
    根据状态码,展示不同的文本,两种方法简单讨论
    列表前台验空的必要性
    thymleaf模板截取日期的年月日,去掉时分秒
    javaWeb锁屏的简单实现
    svn上check下来的项目,用idea打开,菜单栏没有svn工具解决办法
  • 原文地址:https://www.cnblogs.com/AronJudge/p/14643081.html
Copyright © 2011-2022 走看看