单例模式

Posted nyhhd

tags:

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

单例模式有:饿汉,懒汉,静态内部类,枚举,双检锁(最优的就是枚举:没有为什么)
  1)饿汉:jvm加载类时,就加载了单例对象,造成了资源的浪费
    public class A{
      private A(){
      }
      private static A a = new A();
      public static A getInstance(){
        return a;
      }
    }

 

  2)懒汉:会有多线程同步问题(等被调用时才申明对象,且会申明一个静态的)
    public class A{
      private A(){
      }
      private static A a;

      public static A getInstance(){
        if(a==null)
          a=new A();
        return a;
      }
    }


    懒汉和饿汉最大的区别就是
    饿汉在类加载或程序启动时,类对象就被加载完成
    懒汉需等类被第一次初始化时,单例模式才会生成单例对象

  3)枚举:
    enum Single {
      Single;

      private Single() {
      }

      public void print(){
        System.out.println("hello world");
      }
    }

  
    public class SingleDemo {
      public static void main(String[] args) {
        Single a = Single.Single;
        a.print();
      }
    }


  4)加锁的:

    //同步函数的demo(将生成单例对象的方法加锁)
      优点:解决了多线程的同步问题
      缺点:本来只需在第一次初始化单例对象进行同步(防止生成多个对象),此方法需每一次调用都需同步,造成了性能问题
      public static synchronized Single1 getInstance() {   
        if (s == null)
          s = new Single1();

        return s;
      }

  
    //同步代码快的demo加锁,安全高效(双检锁),

      优点:也解决了多线程的同步问题,减缓了单锁的性能问题
      缺点:
      public static Single1 getInStanceBlock(){
        if(s==null)        //只有当对象为空时,在会造成同步效果,
          synchronized (Single1.class) {
            if(s==null)    //第二把锁是防止,其他线程在前一个线程创建完单例对象后,在重复创建
              s = new Single1();
          }
        return s;
      }

注意点:
• 单例模式不会被jvm垃圾回收的
• 实现单例模式需要私有构造器(防止外面在构造对象)、一个静态变量(用于保存单例对象)、一个静态方法(可以直接Class.方法调用)
• 使用多个类加载器时,可能导致单例失效,产生多个实例,解决:自行指定类加载器,并指定同一个类加载器。

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

单例模式(单例设计模式)详解

Java模式设计之单例模式(二)

单例模式(饿汉式单例模式与懒汉式单例模式)

单例模式

单例模式

设计模式之单例模式