Java 设计模式 --- 单例模式

单例模式

一、七种单例模式写法

  1. 单例模式 : 保证全局过程中只存在一个唯一实例的模式 。
  2. 第一种: 饿汉式

    1. 饿汉式相对于 懒汉式消耗内存的 。
    2. 代码

      class Task{
          //在定义这个对象的时候并且给值的形式--- 饿汉式 
          private static Task t = new Task();
          //构造函数私有化
          private Task() {
          }
          public static Task getInstanse(){
              return  t; 
          }
      }
      
  3. 第二种: 饿汉式变种

    1. 代码

      class Task{
          private static Task t;
          static{
              t = new Task();
          }
          public static Task getInstanse(){
              return t;
          }
      }
      
  4. 第三种: 懒汉式

    1. 相对于饿汉式而言 , 线程不安全
    2. 代码

      class Task_02{
          private static Task_02 t;
          private Task_02(){
      
          }
          //在用到的时候才初始化    ---懒汉式
          public static Task_02 getInstanse(){
              if(t ==null){
                  t = new Task_02();
              }
              return t;
          }
      }
      
  5. 第四种 : 懒汉式 线程安全

    1. 效率低 , 99%的情况下不需要同步
    2. 代码:

      class Task_02{
          private static Task_02 t;
          private Task_02(){
      
          }
          //在用到的时候才初始化    ---懒汉式
          public static synchronized Task_02 getInstanse(){
              if(t ==null){
                  t = new Task_02();
              }
              return t;
          }
      }
      
  6. 第五种: 静态内部类

    1. 即使类被加载也不会被实例化 , 只有真正被使用时才会被初始化。
    2. 代码:

      public class SingletonDemo{
          private static class Task_02{
              private static Task_02 t;
              private Task_02(){
      
              }
              //在用到的时候才初始化    ---懒汉式
              public static Task_02 getInstanse(){
                  if(t ==null){
                      t = new Task_02();
                  }
                  return t;
              }
          }
      }
      
  7. 第六种: 枚举

    1. 这是一种被提倡的方式 , 不仅能避免多线程安全问题 , 还能防止反序列化重新创建新的对象。
    2. 代码:

      public enum SingletonDemo{
          INSTANSE;
          public void whateverMethod(){}
      }
      
  8. 第七种: 双重校验锁

    1. 必须在JDK1.5之后才能看到正常的单例效果
    2. 代码:

      class Task_02{
          private static Task_02 t;
          private Task_02(){
      
          }
          //在用到的时候才初始化    ---懒汉式
          public synchronized static Task_02 getInstanse(){
              if(t ==null){
                  synchronized(Singleton.class){
                      if(t == null){
                          t = new Task_02();
                      }
                  }
              }
              return t;
          }
      }
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值