• 单例模式


    1,最简单的实现

        首先在类中新建一个私有的构造函数,这样类就不能被实例话了。然后在类中新建一个私有的静态实例,然后提供一个public方法访问该静态方法,这样使用着就可以使用这个类的实例了。

    public class SingletonClass{
        pirvate static SingletonClass sInstance = new SingletonClass();
        
        public SingletonClass getInstance(){
            return sInstance;
        }    
        
        private SingletonClass(){
        }
    }
    

    2,性能优化--------Lazy loaded

        上例中不管SingletonClass是否使用都会新建一个实例,如果SingletonClass 很耗时,并且可能用不到。代码的变化有两区,一是新建一个实例,赋值为空,知道第一次使用的时候才会赋值。

    public class SingletonClass{
        private static SingletonClass sInstance = null;
    
        public SingletonClass getInstance(){
            if(null == sInstance){
                sInstance = new SingletonClass();
            } 
         
         return sInstance;    
        }
        private SingletonClass(){
        }
    }
    

    3,同步

        上述程序在单线程没有问题,当在多线程下,比喻A线程希望使用SingletonClass实例,第一次调用,发现sInstance是空,就新建sInstance实例,就在这个时候CPU发生时间片切换,切换到进程B,B也要使用实例,因为切换发生在A线程检测完后,所以sInstance是空。这时候A和B线程就会新建不同的实例。

    public class SingletonClass{
        pirvate static SingletonClass sInstance = null;
    
        public synchronized SingletonClass getInstance(){
            if(null == sInstance){
               sInstance = new SingletonClass(); 
           }
    
            return sInstance;
        }
    
        private SingletonClass(){}
    }
    

        需要使用同步锁,一个线程必须等待另一个线程新建完后,才能使用,这样保证了实例的唯一性。

    4,又是性能  

        每次调用实例前,先判断是否为空,如果为空,在同步新建,如果不为空,直接返回,

    public class SingletonClass{
        private atatic SingletonClass sInstance = null;
    
        public SingletonClass getInstance(){
            if(null == sInstance){
                synchronized(SingletonClass.class){
                    sInstance = new SingletonClass(); 
               }
            }
    
            return sInstance;
        }
    
        private SingletonClass(){}   
    }
    

      

  • 相关阅读:
    elasticSearch 查询 bool
    elasticSearch 查询 term
    elasticSearch 查询 match
    python re
    vue day1
    mysql 报错记录
    node.js vue.js 安装
    mysql 插入数据 ,存在跳过
    打印乘法口诀表
    初步使用分支、循环判断数字大小
  • 原文地址:https://www.cnblogs.com/senior-engineer/p/5072309.html
Copyright © 2020-2023  润新知