Java-单例设计模式

单例模式

单线程

饿汉式:

  public Class Singleton{
  //类被加载的时候就实例化一个对象
        private static Singleton singleton1 = new Singleton();
  //私有的构造方法
        private Singleton(){}
  //以自己实例为返回值的静态的公有方法
        public static Singleton getSingleton(){
              return singleton1;
        }
  }

懒汉式:

  public Class Singleton{
        private static Singleton singleton2;
        private Singleton(){}
        public static Singleton getSingleton(){
              if(singleton2 == null){
                    singleton2 = new Singleton();
              }
              return singleton2;
        }
  }

多线程

饿汉式天生线程安全

懒汉式保证线程安全的四种方法:

  • synchronized方法

    public Class Singleton{
          private static Singleton singleton2;
          private Singleton(){}
          public static synchronized Singleton getSingleton(){
                if(singleton2 == null){
                      singleton2 = new Singleton();
                }
                return singleton2;
          }
    }
    
  • synchronized代码块

    public Class Singleton{
          private static Singleton singleton2;
          private Singleton(){}
          public static Singleton getSingleton(){
                synchronized(Singleton.class){
                      if(singleton2 == null){
                            singleton2 = new Singleton();
                      }
                      
                }
                return singleton2;
          }
    }
    
  • 内部类

    public Class Singleton{
          private Singleton(){}
          private static Singleton Holder(){
                private static singleton2 = new Singleton() ;
          }
          public static Singleton getSingleton(){
                return Holder.singleton2;
          }
    }
    
  • 双重延迟检测

    public Class Singleton{
          private static volatile Singleton singleton2;
          private Singleton(){}
          public static Singleton getSingleton(){
                if(singleton2 == null){
                //只在第一次new实例的时候同步
                      synchronized(Singleton.class){
                            singleton2 = new Singleton();
                      }
                      
                }
                return singleton2;
          }
    }
    
  • ThreadLocal

    public Class Singleton{
          private static Singleton singleton2;
          private static ThreadLocal<Singleton> threadLocal = new ThreadLocal<>();
          private Singleton(){}
          private static Singleton CreateSingleton(){
                if (singleton4 == null) {          // 第二次检查:该单例是否被创建
                    singleton4 = new Singleton4();
                }
                threadLocal.set(singleton4);
          }
          public static Singleton getSingleton(){
                if (threadLocal.get() == null) {        // 第一次检查:该线程是否第一次访问
                      createSingleton();
                }
                return singleton2;
          }
    }
    
posted @ 2020-09-09 12:56  rikarika  阅读(95)  评论(0)    收藏  举报