zoukankan      html  css  js  c++  java
  • 单例模式

    最简单的实现

        public class Singleton
        {
            private static Singleton instance;
            private Singleton()
            {
                
            }
            
            public static Singleton getInstance()
            {
                if(instance == null)
                {
                    instance = new Singleton();
                }
                
                return instance;
            }
                
        }

    但是在多线程的情况下有问题,继续改进

     public class Singleton
        {
            private static Singleton instance;
            private Singleton()
            {
                
            }
            
            public static synchronized Singleton getInstance()
            {
                if(instance == null)
                {
                    instance = new Singleton();
                }
                
                return instance;
            }
                
        }

      存在问题:通过增加synchronized关键字。但是同步会降低性能

         解决方案:

            1。如果getInstance()的性能对应用程序不是很关键,就什么都别做。
                如果你的应用程序可以接受getInstance()造成的额外负担,就忘了这件事吧。同步如果你的应用程序可以接受getInstance()地方法既简单又有效。但是你必须知道,同步一个方法               可能造成程序执行效率下降100倍,因此,如果将如果你的应用程序可以接受getInstance()的程序使用在频繁的地方,你可能得重新考虑了。

          2.使用"急切"创建实例,而不用延迟实例化的做法
            如果应用程序总是创建并使用单例,或者在创建和运行时方面的负担不太繁重,你可能想要急切创建此单件。

    public class Singleton
    {
        private static Singleton instance = new Singleton();
        private Singleton()
        {
            
        }
        
        public static synchronized Singleton getInstance()
        {
            return instance;
        }   
    }

          3.用"双重检查加锁",在getInstance()中减少同步
             利用双重加锁(double-checked locking),首先检查是否实例已经创建了,如果尚未创建,"才"进行同步。这样一来,只有第一次会同步,这正是我们想要的。

    public class Singleton
    {
        private static volatile Singleton instance;
        private Singleton()
        {
            
        }
        
        public static Singleton getInstance()
        {
            if (instance == null)
            {
                synchronized(Singleton.class)
                {
                    instance = new Singleton();
                }
            }
            
            return instance;
        }         
    }

      

  • 相关阅读:
    前端 -- html
    MySQL索引
    Python操作MySQL
    MySQL表操作进阶
    MySQL表操作基础
    Github使用教程
    Android开发面试题
    MYSQL学习记录
    Java开发从零到现在
    JavaWeb(JSP/Servlet/上传/下载/分页/MVC/三层架构/Ajax)
  • 原文地址:https://www.cnblogs.com/ld-swust/p/6061673.html
Copyright © 2011-2022 走看看