• 设计模式之单例模式


    单例模式  Singleton

    参考:https://www.cnblogs.com/zuoxiaolong/p/pattern2.html    侵权删除

    什么是单例模式:保证在程序运行周期,至多有一个该对象。

    适用性:对象多次重复实例化的场景

    单例模式分类:饿汉式、懒汉式、静态内部类

    代码要点:

    私有化构造函数:保证外部不能实例化对象

    私有静态对象:不公开只能通过公开静态获取对象的方法获取对象、公开静态获取对象的方法是静态所以静态

    公开静态获取对象的方法:在没有实例的情况下,对开提供获取对象方法。

    基本代码如下:

    package EagerSingleton;
    /**
     * 饿汉模式:类的初始化阶段就实例化对象,如果未使用到该对象,会造成资源的浪费,不存在线程安全问题。
     *
     */
    public class EagerSingleton {
        //上来就实例化对象,如果未使用到该对象,会造成资源的浪费
        private static EagerSingleton instance = new EagerSingleton();
        private EagerSingleton(){}
        public static EagerSingleton getInstance(){
            return instance;
        }
    }
    package LazySingleton;
    
    /**
     * 懒汉模式
     * 只有当第一次需要使用该类的对象时,才创造类,比较的懒
     * 为了保证在多线程的情况下只能创建一个实例,可以使用双检查锁,单检查锁(下面的代码没有实现)
     * 单检查锁:保证一个实例,但是性能不高,许多线程处于阻塞状态。
     * 双检查锁:由于JVM的reorderu优化的原因,可能其他线程会返回一个null的实例
     */
    public class LazySingleton {
        private static LazySingleton instance;
        private LazySingleton() {
        }
        public static LazySingleton getInstance(){
    
            if(instance==null){
                //instance = new LazySingleton();
                synchronized (LazySingleton.class){
                    if(instance==null){
                        instance = new LazySingleton();
                    }
                }
            }
            return instance;
        }
    }
    package InnerSingleton;
    
    /**
     * 静态内部类的方法
     * 静态内部类中保存单例,当客户端调用静态方法getInstance()时,会导致InnerSingleton的初始化,再导致静态成员SingletonHolder的初始化,instance得到实例化。
     * 因此只会在虚拟机装载类的时候初始化一次,并由虚拟机来保证它的线程安全性
     */
    public class InnerSingleton {
        private InnerSingleton(){}
        //当客户端调用静态方法getInstance()时,会导致InnerSingleton的初始化,再导致静态成员SingletonHolder的初始化
        private static class SingletonHolder{
            // instance得到实例化。
            private static InnerSingleton instance = new InnerSingleton();
        }
    
        public static InnerSingleton getInstance(){
            return SingletonHolder.instance;
        }
    }
  • 相关阅读:
    matlab练习程序(连续系统辨识与响应)
    【转】灵敏度可以是负值吗_【技术指南】 精确度,准确度,分辨率和灵敏度
    XStream升级1.4.18问题 规格严格
    基于Flink的网络流量实时解析 规格严格
    Maven构建时报错,File encoding has not been set, using platform encoding GBK解决方法 规格严格
    Spring Boot动态修改日志级别 规格严格
    内存分析工具 规格严格
    ES5.6.12客户端连接报错Caused by: java.lang.ClassNotFoundException: org.elasticsearch.http.AbstractHttpServe 规格严格
    动态调整日志等级 规格严格
    时序数据库存储初识1 规格严格
  • 原文地址:https://www.cnblogs.com/youzoulalala/p/11063445.html
Copyright © 2020-2023  润新知