zoukankan      html  css  js  c++  java
  • 饿汉式,懒汉式

    大家觉得单例模式中 饿汉式用的多还是懒汉式比较多???
    饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不在改变
    懒汉式如果在创建实例对象时不加上synchronized则会导致对对象的访问不是线程安全的。
    双重检查加锁
    这个貌似不错
    貌似懒汉式不错  基本可以兼顾
    双重检查加锁
    可以使用"双重检查加锁"的方式来实现,就可以既实现线程安全,又能够使性能不受到很大的影响。那么什么是"双重检查加锁"机制呢?
    所谓双重检查加锁机制,指的是:并不是每次进入getInstance方法都需要同步,而是先不同步,进入方法过后,先检查实例是否存在,如果不存在才进入下面的同步块,这是第一重检查。进入同步块过后,再次检查实例是否存在,如果不存在,就在同步的情况下创建一个实例,这是第二重检查。这样一来,就只需要同步一次了,从而减少了多次在同步情况下进行判断所浪费的时间。
    双重检查加锁机制的实现会使用一个关键字volatile,它的意思是:被volatile修饰的变量的值,将不会被本地线程缓存,所有对该变量的读写都是直接操作共享内存,从而确保多个线程能正确的处理该变量。
    看看代码可能会更加清楚些。
    public class Singleton {  
          
        private volatile static Singleton instance = null;  
        private Singleton(){  
        }  
        public static  Singleton getInstance(){  
            //先检查实例是否存在,如果不存在才进入下面的同步块  
            if(instance == null){  
                //同步块,线程安全地创建实例  
                synchronized(Singleton.class){  
                    //再次检查实例是否存在,如果不存在才真正地创建实例  
                    if(instance == null){  
                        instance = new Singleton();  
                    }  
                }  
            }  
            return instance;  
        }  
    }
     
     
         饿汉式:
            public class Singleton{
                private static Singleton singleton = new Singleton ();
                private Singleton (){}
                public Singleton getInstance(){return singletion;}
           } 

         懒汉式:
           public class Singleton{
                private static Singleton singleton = null;
                public static synchronized synchronized getInstance(){
                     if(singleton==null){
                         singleton = new Singleton();
                     }
                    return singleton;
                }
           } 

         比较:
             饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不在改变
              懒汉式如果在创建实例对象时不加上synchronized则会导致对对象的访问不是线程安全的
              推荐使用第一种
     
  • 相关阅读:
    warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
    Windows10+CLion+OpenCV4.5.2开发环境搭建
    Android解决部分机型WebView播放视频全屏按钮灰色无法点击、点击全屏白屏无法播放等问题
    MediaCodec.configure Picture Width(1080) or Height(2163) invalid, should N*2
    tesseract
    Caer -- a friendly API wrapper for OpenCV
    Integrating OpenCV python tool into one SKlearn MNIST example for supporting prediction
    Integrating Hub with one sklearn mnist example
    What is WSGI (Web Server Gateway Interface)?
    Hub --- 机器学习燃料(数据)的仓库
  • 原文地址:https://www.cnblogs.com/heri/p/2916422.html
Copyright © 2011-2022 走看看