• 单例模式


    最简单的实现

        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;
        }         
    }

      

  • 相关阅读:
    zookeeper开源客户端curator
    elastic-job(lite)使用的一些注意事项
    zookeeper典型应用场景之一:master选举
    zookeeper学习笔记
    spring-boot子模块打包的jar中去掉BOOT-INF文件夹
    win10如何找回自带的照片查看器
    Hbase shell详情
    linux tar.gz zip 解压缩 压缩命令
    Java中Volatile关键字详解
    系统变量之System.getenv()和System.getProperty()
  • 原文地址:https://www.cnblogs.com/ld-swust/p/6061673.html
Copyright © 2020-2023  润新知