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

  • 相关阅读:
    固定执行计划-SQL PROFILE手工绑定
    其他典型的执行计划
    oracle-常见的执行计划(一)
    DBMS_XPLAN详细说明
    sql-查看执行计划的方法
    CBO基础概念
    webpack生产环境保留某些console.log
    提升webpack构建速度(二)
    提升webpack构建速度(一)
    【译文】更有效的调试webpack在构建时出现的错误
  • 原文地址:https://www.cnblogs.com/javafucker/p/9522501.html
Copyright © 2011-2022 走看看