zoukankan      html  css  js  c++  java
  • 01 单例模式

    单例模式

    • 保证某个类只存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)

    以下模式斜体为推荐使用

    • JDK中,java.lang.Runtime就是经典的单例模式(饿汉式)
    • 使用场景:需要频繁的进行创建和销毁对象,创建对象时耗时过多或耗费资源过多(即:重量级对象),但又经常用到的对象、工具类对象、平凡访问数据库或文件的对象(如数据源、session工厂等)
    1 饿汉式(静态变量)

    实现步骤:

    • 构造器私有化
    • 类的内部创建对象
    • 向外暴露一个静态公共方法
    • 代码实现

    优缺点:

    • 写法简单,在类加载的时候即完成了实例化,避免了线程同步问题。
    • 没有达到Lazy Loading效果,可能会造成内存浪费。
    2 饿汉式(静态代码块)

    本质同上

    3 懒汉式(线程不安全)

    代码实现:

    class Singleton{
        private static Singleton instance;
        
        private Singleton(){}
        
        public static Singleton getInstance(){
            if(instance == null)
                instance = new Singleton();
            return instance;
        }
    }
    

    优缺点:

    • 起到了lazy loading效果,但只能在单线程下使用
    • 实际开发不推荐使用
    4 懒汉式(线程安全,同步方法)

    代码实现:

    class Singleton{
        private static Singleton instance;
        
        private Singleton(){}
        //在方法上加了synchronized
        public static synchronized Singleton getInstance(){
            if(instance == null)
                instance = new Singleton();
            return instance;
        }
    }
    

    优缺点:

    • 效率太低
    • 不推荐使用
    5 懒汉式(线程安全,同步代码块)
    class Singleton{
        private static Singleton instance;
        
        private Singleton(){}
      
        public static Singleton getInstance(){
            if(instance == null){
                synchronized(Singleton.class){
                    instance = new Singleton();
                }   
            }
            return instance;
        }
    }
    

    不推荐使用

    6 双重检查

    代码实现:

    class Singleton{
        private static volatile Singleton instance;
        
        private Singleton(){}
      
        public static synchronized Singleton getInstance(){
            if(instance == null){
                synchronized(Singleton.class){
                	if(instance == null)
                    	instance = new Singleton();
                }   
            }
            return instance;
        }
    }
    

    优缺点:

    • 线程安全
    • 延迟加载
    • 推荐使用
    7 静态内部类

    代码实现:

    class Singleton{
        private static volatile Singleton instance;
        
        private Singleton(){}
      	
        private static class SingletonInstance{
            private static final Singleton INSTANCE = new Singleton();
        }
        public static synchronized Singleton getInstance(){
        	return SingletonInstance.INSTANCE;
        }
    }
    

    静态内部类特点:

    • 加载外部类时,内部类不会自动加载,只有使用到内部类的时候内部类才会加载。

    优缺点:

    • 懒加载
    • 线程安全
    • 推荐使用
    8 枚举

    代码实现:

    enum Singleton{
        INSTANCE; //属性
        public void sayOK(){
            System.out.println("ok~");
        }
    }
    

    优缺点:

    • 借助枚举实现单例模式,不仅能避免多线程同步问题,而且还能放置反序列化重新创建新的对象
    • 推荐使用
  • 相关阅读:
    IIS6.0服务器架站无法访问解决方案总结
    DNN中做支持多语言的模块
    在dotnetnuke中创建 parent portal
    DNN,Rainbow资源
    2005年岁末,各种主流CMS系统的比较和汇总
    在DNN中获取所有模块信息
    学习dnn的新资源,sooooooooo great!!
    DNN的电子商务模块
    DNN学习笔记
    也学ASP.NET 2.0 AJAX 之二:使用Timer控件
  • 原文地址:https://www.cnblogs.com/nojacky/p/13916715.html
Copyright © 2011-2022 走看看