zoukankan      html  css  js  c++  java
  • Java设计模式之【单例模式】

    Java设计模式之【单例模式】

    何为单例

    在应用的生存周期中,一个类的实例有且仅有一个

    当在一些业务中需要规定某个类的实例有且仅有一个时,就可以用单例模式

    比如spring容器默认初始化的实例就是单例的

    单例如何实现

    1、在类中定义私有的静态变量,类型为本类

    2、构造器私有化

    3、获取单实例的共有静态方法

    代码

    一、懒加载模式

    public class Component {
    
        /**
         * 定义私有的静态变量来存放本类的单实例
         * 私有保证外部无法直接获取本实例
         * 静态保证本实例不会被回收
         */
        private static Component component;
    
        private Component(){}   //构造器私有化,保证外部无法生成本类的实例,只能在本类中创建实例
    
        /**
         * 公共的静态同步方法用来获取本类的单实例
         * 保证线程安全(只有一个实例)
         * 延迟加载单实例,在第一次调用时才初始化本实例
         * @return
         */
        public static synchronized Component getInstance(){
            if(component == null)
                component = new Component();
            return component;
        }
    
    }

    二、积极加载模式

    public class Component {
    
        private static Component component = new Component();   //在类加载的时候就初始化本实例
    
        private Component(){}   //构造器私有化保证只能在类内部创建本实例
    
        public static Component getInstance(){
            return component;
        }
    
    }

    三、双重判断加锁模式

    public class Component {
    
        private static Component component;
    
        private Component(){}
    
        /**
         * 双重判断加锁机制
         * @return
         */
        public static Component getInstance(){
            if(component == null){
                synchronized (Component.class){
                    if(component == null)
                        component = new Component();
                }
            }
            return component;
        }
    
    }

    在懒加载模式中,每次获取实例都要加锁,这会使程序运行速度变慢,通过双重判断加锁机制可以解决这个问题

    方法本身不加锁,进入方法之后先判断实例是否存在,如果存在就直接返回了,这里是多线程的

    如果不存在,往下走就加锁变单线程了,但是在进入同步块中还要进行一次判断

    关于单例模式这篇博客讲得很好:https://www.cnblogs.com/V1haoge/p/6510196.html

  • 相关阅读:
    用js实现cookie的读、写、全部删除和删除指定cookie值的删除---源码
    JS手机号码格式验证
    vuex
    解决“此图片来自微信公众平台未经允许不可引用”的方法
    二叉树
    剑指 Offer 10- II. 青蛙跳台阶问题
    logrotate处理Gunicorn日志
    Linux日志切割神器logrotate原理介绍和配置详解
    Jenkins任务启动的后台进程被自动kill
    Flex、Grid、媒体查询实现响应式布局
  • 原文地址:https://www.cnblogs.com/javafucker/p/9522501.html
Copyright © 2011-2022 走看看