浅谈单例模式

Posted 永远年青

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈单例模式相关的知识,希望对你有一定的参考价值。

单例模式其实我们再熟悉不过了,线程安全单例模式的写法是如下这样的:

public class Singleton {  
   private Singleton(){        System.out.println("单例类Singleton的构造函数私有...");      }  
   private
static Singleton instance = new Singleton();  
   public static Singleton getInstance(){    
       return instance;      }  
   public
static void doAnotherThing(String str){        System.out.println(str+":单例类Singleton还有其他角色...");      } }

上面这个单例模式的写法虽然线程安全,但是假如在执行doAnotherThing静态方法时,Singleton的构造函数也会被执行,就是说Singleton会被加载进去,但是至于能不能用上还不确定,所以可能会存在一定的资源浪费和性能问题。
那么getInstance()方法可以改成这样,前面的instance直接指向空:

   if (instance == null){      instance = new Singleton();    }

这样虽然解决问题了,但是线程又不安全了,你可能会说加上同步关键字,那这样的话性能依然还是有问题。
有如下这样的写法可以两全其美:

public class StaticSingleton {  
   private StaticSingleton(){        System.out.println("单例类StaticSingleton的构造函数私有...");      }  
   private static class SingletonHolder{    
       private static StaticSingleton instance = new StaticSingleton();      }  
   public static StaticSingleton getInstance(){    
       return
SingletonHolder.instance;      }  
   public
static void doAnotherThing(String str){        System.out.println(str+":单例类Singleton还有其他角色...");      } }

我们都知道类在被加载时,其内部类是不会被初始化的,只有在用到getInstance()的时候SingletonHolder内部类才被加载。可见这种单例模式是兼具线程安全和性能的完美方案,其实这种方式有点类似代理。


以上是关于浅谈单例模式的主要内容,如果未能解决你的问题,请参考以下文章

再谈单例模式

浅谈单页应用和多页应用——Vue.js向

如何写出面试官欣赏的Java单例

浅谈单神经元网络PID控制算法

浅谈JAVA设计模式之——单例模式(Singleton)

浅谈Java单例模式设计