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

    核心作用:保证一个类只有一个实例,并提供一个访问该实例的全局访问点
    实现思路:懒汉式、饿汉式、双重检测锁、内部类式、枚举式

    • 懒汉式:直接声明一个私有的静态类成员,然后将其构造器私有化

      • 优点:线程安全,调用效率高
      • 缺点:不能实现预加载
      • 实现过程:
      public Class LazySingleClass{
          private static instance=new LazySingleClass();
          private LazySingleClass(){}    //构造器私有化
          public static LazySingleClass getInstance(){
              return instance;
          }
      }
      
    • 饿汉式:只是声明一个私有的静态类,但不进行初始化,第一次使用的时候进行初始化,要加上同步字段

      • 优点:线程安全,调用效率高,可以实现预加载
      • 缺点:
      • 实现过程:
       public Class HungrySingleClass{
           private static instance;
           private HungrySingleClass(){}
           public static HungrySingleClass getInstance(){
              if(instance==null){
                  instance=new HungrySingleClass();
               } 
               return instance;
           }
       }
      
    • 双层检测锁

      • 优点:
      • 缺点:由于jvm优化的问题,在使用的过程中可能会出错
      • 实现过程
       /**
       * 双重检测锁
       * 该模式将同步加到了if后边提高了调用的效率,但是偶然会出现问题
       * @author Admain
       *
       */
      public class DoubleLock {
      private  DoubleLock() {	}
      private static DoubleLock instance;
      public static synchronized DoubleLock getInstance(){
      	//检测两次instance是否为null
      	if(instance==null){ //第一次检查
      	synchronized (DoubleLock.class) {
      		if(instance==null){
      			instance=new DoubleLock();//第二次检查
      		}
      		}	
      	}
      	return instance;
      }
      }
      }  
      
    • 内部类方式:通过内部类持有对象来实现单例模式

      • 优点:线程安全,调用效率高,可以延时加载
      • 代码实现
      public class StaticInnerClass {
      private StaticInnerClass(){}
      //内部类天然线程安全,没有同步代码块效率高
      private static class innerClass{
      	private static final StaticInnerClass instance=new StaticInnerClass(); 
      }
      public static StaticInnerClass getInstance(){
      	return innerClass.instance;
      }
      }  
      
    • 枚举方式实现:定义枚举类型,然后在枚举类体内添加需要的方法

      • 优点:利用了枚举天然单例的的特点,线程安全,调用效率高,可以延时加载
      • 代码实现:
      public enum EnumStyle {
      //则个枚举元素,本身就是一个单例模式,但是不能延时加载,可以天然防止反射和反序列化的漏洞
      instance;
      //添加自己所需要的操作
      public void operation(){
         System.out.println("操作单例对象");
      }
      }  
      
  • 相关阅读:
    常用的十种排序
    [CSP-S模拟测试]:Weed(线段树)
    [CSP-S模拟测试]:Blue(贪心)
    $LaTeX$数学公式大全13
    $LaTeX$数学公式大全12
    $LaTeX$数学公式大全11
    $LaTeX$数学公式大全10
    $LaTeX$数学公式大全9
    $LaTeX$数学公式大全8
    [CSP-S模拟测试]:石头剪刀布(rps)(概率DP)
  • 原文地址:https://www.cnblogs.com/goWithHappy/p/10671670.html
Copyright © 2011-2022 走看看