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

    设计模式分类

    设计模式分为三种类型,共23种 1)

    1. 创建型模式:单例模式、抽象工厂模式、原型模式、建造者模式、工厂模式。
    2. 结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享 元模式、代理模式。
    3. 行为型模式:模版方法模式、命令模式、访问者模式、迭代器模式、观察者 模式、中介者模式、备忘录模式、解释器模式(Interpreter模式)、状态模 式、策略模式、职责链模式(责任链模式)。

    单例模式

    在整个软件系统中某个类只有一个实例化对象 即为单例模式

    单例模式有八种

    1. 饿汉式

    这种写法比较简单,就是在类装载的时候就完成实例化。避免了线程同 步问题。

    在类装载的时候就完成实例化,没有达到Lazy Loading的效果。如果从始 至终从未使用过这个实例,则会造成内存的浪费

    public class Singleton {  
        private static Singleton instance = new Singleton();  
        private Singleton (){}  
        public static Singleton getInstance() {  
        return instance;  
        }  
    }
    
    1. 懒汉式

    解决了线程不安全问题

    效率太低了,每个线程在想获得类的实例时候,执行getInstance()方法都要进行 同步。而其实这个方法只执行一次实例化代码就够了,后面的想获得该类实例, 直接return就行了。

    方法进行同步效率太低

    public class Singleton {  
        private static Singleton instance;  
        private Singleton (){}  
        public static synchronized Singleton getInstance() {  
        if (instance == null) {  
            instance = new Singleton();  
        }  
        return instance;  
        }  
    }
    
    1. 双重检查

    双重检查概念是多线程开发中常使用到的,如代码中所示,我们进行了两 次if (singleton == null)检查,这样就可以保证线程安全了。

    这样,实例化代码只用执行一次,后面再次访问时,判断if (singleton == null), 直接return实例化对象,也避免的反复进行方法同步.

    线程安全;延迟加载;效率较高

    class Singleton {
        private static volatile Singleton singleton;
    
        private Singleton() {
        }
    
        public static synchronized Singleton getSingleton() {
            if (Singleton.singleton == null) {
                synchronized (Singleton.class) {
                    if (Singleton.singleton == null) {
                        Singleton.singleton = new Singleton();
                        return Singleton.singleton;
                    }
                }
    
            }
            return Singleton.singleton;
        }
        
    }
    
    1. 静态内部类

    这种方式采用了类装载的机制来保证初始化实例时只有一个线程。

    静态内部类方式在Singleton类被装载时并不会立即实例化,而是在需要实例化 时,调用getInstance方法,才会装载SingletonHolder类,从而完成Singleton的 实例化。

    类的静态属性只会在第一次加载类的时候初始化,所以在这里,JVM帮助我们 保证了线程的安全性,在类进行初始化时,别的线程是无法进入的。

    避免了线程不安全,利用静态内部类特点实现延迟加载,效率高

    public class Singleton {  
        private static class SingletonHolder {  
        private static final Singleton INSTANCE = new Singleton();  
        }  
        private Singleton (){}  
        public static final Singleton getInstance() {  
        return SingletonHolder.INSTANCE;  
        }  
    }
    
    1. 枚举
    public enum Singleton {  
        INSTANCE;  
        public void whateverMethod() {  
        }  
    }
    
  • 相关阅读:
    从尾到头打印链表(基于js)
    替换空格(基于js)
    二维数组的查找(基于js)
    关于document对象
    js之DOM操作总结
    将博客搬至CSDN
    关于js中的数组
    干货集中营
    vim编辑器学习记录
    python3 多线程爆破ftp、mysql、ssh
  • 原文地址:https://www.cnblogs.com/huangshen/p/13292880.html
Copyright © 2011-2022 走看看