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

    单例模式的五种方式

    主要:懒汉式,饿汉式

    其他:双重检测锁(Double Checking模式),静态内部类,枚举模式

    选取时机

    延时加载,占用内部资源大:静态内部类好于懒汉

    不延时加载,占用内部资源小:枚举好于饿汉

    /**
     * 单例模式 懒汉式
     * @author 小帆敲代码
     *
     */
    public class Demo01 {
     //类加载时,不初始化(可以延时加载)
     private static Demo01 instance;
     private Demo01(){
     }
     //上锁,并发效率低
     public static synchronized Demo01  getInstance() {
      if(instance==null) {
       instance=new Demo01();
      }
      return instance;
     }
    }

    /**
     * 单例模式 饿汉式
     * @author 小帆敲代码
     *
     */
    public class Demo02 {
     //类加载时,对象就被初始化(不可以延时加载),天然的线程安全,并发效率高
     private static Demo02 instance=new Demo02();
     private Demo02(){
     }
     //不上锁,并发效率高
     public static  Demo02  getInstance() {
      return instance;
     }
    }

    /**
     * 双重检测 Double checking
     * 问题 指令重排和JVM内部模型不支持可能会带来问题
     * 解决方法:volatile取消指令重排
     * @author 小帆敲代码
     *
     */
    public class Demo03 {
      private /* volatile*/ static Demo03 instance=null;
      private Demo03() {
       
      }
      public static Demo03 getInstance() {
       //double checking
       if(null==instance) {
        //只在第一次创建时锁
        synchronized(Demo03.class) {
         if(null==instance)
         instance=new Demo03();
        }
       }
       return instance;
      }
    }

    /**
     * 静态内部类实现单例模式
     * 线程安全,效率高,延迟加载
     * @author 小帆敲代码
     *
     */
    public class Demo04 {
     //外部类没有static属性,只有在被使用时才会被加载内部类
      private static class SingleDemo04{
       private static /*final*/ Demo04 instance=new Demo04();
      }
      private Demo04() {
       
      }
      public static Demo04 getInstance() {
       return new SingleDemo04().instance;
      }
    }

    /**
     * 枚举模式实现单例
     * 保证只有一个,线程安全,天然的防止反射和反序列化的漏洞
     * 不能延时加载
     * @author 小帆敲代码
     *
     */
    public enum Demo05 {
     //只有一个实例
      INSTANCE;
     
     //其他操作
     public void dosomething() {
      
     }
    }

  • 相关阅读:
    android实现点击短链接进入应用 并获得整个连接的内容
    机房收费系统=三层+设计模式
    【数据库】SQL优化方法汇总
    HBase 数据库检索性能优化策略--转
    How to fix “HTTP Status Code 505 – HTTP Version Not Supported” error?--转
    使用VBS控制声音
    MSG命令使用详解
    bat删除系统默认共享
    C#:消息队列应用程序
    读写XML文档时,去掉新增加节点的“空命名空间”(xmlns=””)
  • 原文地址:https://www.cnblogs.com/code-fun/p/11304768.html
Copyright © 2011-2022 走看看