• 单例模式--饿汉模式和懒汉模式


    一、所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例

    具体代码的实现:

    1、饿汉模式(提前创建对象)

    // 饿汉模式
    class Bank{
        //提供私有的构造器
        private Bank(){
        }
        //内部创建类的对象
        //此对象也必须创建为静态的
        private static Bank Instance = new Bank();
    
        //提供公共的静态方法,返回类的对象
        public static Bank getInstance(){
            return Instance;
        }
    }

    2.懒汉模式(延迟创建对象)

    //懒汉模式
    class Bank1{
        //提供私有的构造器
        private Bank1(){
        }
        //声明一个没有初始化的当前类对象
        //此对象也必须创建为静态的
        private static Bank1 Instance= null;
    
        //创建一个返回当前类对象的公共静态方法
        public static Bank1 getInstance(){
            if (Instance == null){
    Instance
    = new Bank1(); } return Instance; } }

    两种方式的对比:
    * 饿汉式:
    * 坏处:对象加载时间过长。
    * 好处:饿汉式是线程安全
    *
    * 懒汉式:好处:延迟对象的创建。
    * 目前的写法坏处:线程不安全。--->到多线程内容时,再修改

    创建方式上的相同与不同:

    相同点:两者都需要创建私有的构造器,声明私有静态类的对象,创建返回当前类对象的公共静态方法

    不同点:1、饿汉模式在声明私有静态类的对象时对对象进行实例化

        //内部创建类的对象
        //此对象也必须创建为静态的
        private static Bank Instance = new Bank();

        懒汉模式在声明私有静态类的对象时不进行实例化

       //声明一个没有初始化的当前类对象
        //此对象也必须创建为静态的
        private static Bank1 Instance= null;

      2、饿汉模式:调用公共的静态方法,返回类的对象

     //提供公共的静态方法,返回类的对象
        public static Bank getInstance(){
            return Instance;
        }

        懒汉模式:调用公共的静态方法时需要判断对象名是否为空,若‘真’则对对象进行实例化,‘否’则返回已经创建过的对象。

    //创建一个返回当前类对象的公共静态方法
        public static Bank1 getInstance(){
            if (Instance == null){
                Instance = new Bank1();
            }
            return Instance;
        }

     使用同步机制将单例模式中的懒汉式改写为线程安全的。

    方式一:每个线程进来时都需要等待前一个线程执行完毕才能进入判断,若已被实例化则之后的线程等待的时间是无意义的,增加了消耗时间。

    方式二:在加入synchronized同步代码块之前先判断一遍对象是否实例化,若已被实例化则不需要等待获取锁,直接获取对象。减少消耗时间提高效率。

    class Bank{
    
        private Bank(){}
    
        private static Bank instance = null;
    
        public static Bank getInstance(){
            //方式一:效率稍差
    //        synchronized (Bank.class) {
    //            if(instance == null){
    //
    //                instance = new Bank();
    //            }
    //            return instance;
    //        }
            //方式二:效率更高
            if(instance == null){
    
                synchronized (Bank.class) {
                    if(instance == null){
    
                        instance = new Bank();
                    }
    
                }
            }
            return instance;
        }
    
    }

     

  • 相关阅读:
    [Flink原理介绍第四篇】:Flink的Checkpoint和Savepoint介绍
    Flink -- Barrier
    深入理解Flink ---- End-to-End Exactly-Once语义
    深入理解Flink ---- 系统内部消息传递的exactly once语义
    flink watermark介绍
    flink中对于window和watermark的一些理解
    Apache Flink:详细入门
    flink学习之十一-window&EventTime实例
    Lambda语法
    String s = “1a2a3a4a” 解码为 “1234”
  • 原文地址:https://www.cnblogs.com/lixia0604/p/13441659.html
Copyright © 2020-2023  润新知