美文网首页
设计模式:单例模式(1)

设计模式:单例模式(1)

作者: 谁家的猪 | 来源:发表于2019-07-20 10:28 被阅读0次

    定义与类型

    定义:保证一个类仅有一个实例,并提供一个全局访问点
    类型:创建型

    适用场景

    • 想确保任何情况下都绝对只有一个实例

    优点

    • 在内存里只有一个实例,减少了内存开销
    • 可以避免对资源的多重占用
    • 设置全局访问点,严格控制访问

    缺点

    • 没有接口,扩展困难

    重点

    • 私有构造器
    • 线程安全
    • 延迟加载
    • 序列化和反序列化安全
    • 反射

    相关设计模式

    • 单例模式和工厂模式
    • 单例模式和享元模式

    代码实现

    DoubleCheck双重检查

    1. 创建LazySingleton类
    /**
     * @author lijiayin
     */
    public class LazySingleton {
        private static volatile LazySingleton lazySingleton = null;
        private LazySingleton(){
            
        }
        public static LazySingleton getInstance(){
            if(lazySingleton == null){
                synchronized (LazySingleton.class){
                    if(lazySingleton == null){
                        lazySingleton = new LazySingleton();
                        //1.分配内存给这个对象
                        //2.初始化对象
                        //3.设置lazySingleton指向刚才分配的内存
                        //没有volatile时,2和3可能指令重排序
                    }
                }
            }
            return lazySingleton;
        }
    }
    
    1. 创建测试类
    /**
     * @author lijiayin
     */
    public class Test {
    
        public static void main(String[] args) {
            Thread t1 = new Thread(() -> {
               LazySingleton lazySingleton = LazySingleton.getInstance();
                System.out.println(Thread.currentThread().getName() + ":" + lazySingleton);
            });
            Thread t2 = new Thread(() -> {
                LazySingleton lazySingleton = LazySingleton.getInstance();
                System.out.println(Thread.currentThread().getName() + ":" + lazySingleton);
            });
            t1.start();
            t2.start();
            System.out.println("program end");
        }
    }
    
    1. 类的初始化
      3.1 单线程中类的初始化,没有volatile关键字


      单线程中类的初始化.png

      3.2 多线程中类的初始化,没有volatile关键字


      多线程中类的初始化.png

    相关文章

      网友评论

          本文标题:设计模式:单例模式(1)

          本文链接:https://www.haomeiwen.com/subject/uqfelctx.html