• 单例模式(懒汉式、饿汉式)


    .单例模式

    什么是单例模式?(只有一个自己在堆内存中所创建的实例)

    1.单例模式有以下的特点?

               1)单例类只能有一个实例

               2)单例类必须自己创建自己的唯一实例

               3)单例类必须给所有其他对象提供这一实例

                //减少堆内存的占用

     

    2.单例模式分类?

               1)懒汉式:第一次在调用自己的时候实例化自己。

               2)饿汉式:在类初始化时,自己自行实例化

    package DesignModel;
    
    public class Singleton {
        /*
        *懒汉式:第一次在调用自己的时候实例化自己。
         */
        private static Singleton singleton;
        //为什么要定义为私有?看看蓝白书,因为只能在本类内部才能返回创建它的对象
        public synchronized static Singleton getInstance(){
            //加个锁,这样的话,就可以解决线程不安全的问题synchronized
            //锁和同步有什么区别吗?是同一个东西吗?锁是一种机制,而同步包含锁,其实异步也可以加锁。
            if (singleton==null){
                singleton=new Singleton();//new一个类
            }
            return singleton;//成员属性
        }
        /*实例化Singleton类*/
    }
    
    /*
    *饿汉式单例类,在类初始化时,自己自行实例化
     */
    class Singleton1{
        private static Singleton1 singleton1=new Singleton1();
        //static地址唯一
        public static Singleton1 getInstance(){
            //查getInstance(),表示返回一个实例对象
            /*在未调用getInstance这个方法之前就立马的实例化了,
            即提前初始化,所以会浪费内存,但如果是多线程的情况下,
            可能一个类会被加载多次,而这就违背了单例模式的特点了,
            所以从这点来讲的话,饿汉比懒汉式更安全*/
            return singleton1;
            //若它也用Singleton方式来创建对象,再用==来判断也是true
        }
    }
    
    class TestSingleton{
        public static void main(String[] args) {
    
            Singleton instance1=Singleton.getInstance();
            Singleton instance2=Singleton.getInstance();
            Singleton instance3=new Singleton();
            Singleton instance4=new Singleton();
            System.out.println(instance1==instance2);//true
            System.out.println(instance3==instance4);//false,在堆内存中有两块
            //判断内存的地址是否相同,相当于在JVM的堆内存中只是存放了一个,只能初始化一次
    
            Singleton1 singleton1=Singleton1.getInstance();
            Singleton1 singleton2=Singleton1.getInstance();
            System.out.println(singleton1==singleton2);//true
        }
    }

    3.懒汉式和饿汉式的区别?

    懒汉式:第一次在调用自己的时候实例化自己。

    饿汉式:在类初始化时,自己自行实例化

    因为这个概念的缘由,所以饿汉式比懒汉式更安全。

    (但如果是多线程的情况下,可能一个类会被加载多次,而这就违背了单例模式的特点了, 所以从这点来讲的话,饿汉比懒汉式更安全)
    懒汉式框架:
    public class Singleton {
        /*
        *懒汉式:第一次在调用自己的时候实例化自己。
         */
        private static Singleton singleton;
        public synchronized static Singleton getInstance(){
            if (singleton==null){
                singleton=new Singleton();//new一个类
            }
            return singleton;//成员属性
        }
        /*实例化Singleton类*/
    }
    饿汉式框架:
    class Singleton1{
         /*
          *饿汉式单例类,在类初始化时,自己自行实例化
          */
        private static Singleton1 singleton1=new Singleton1();
        //static地址唯一
        public static Singleton1 getInstance(){
            return singleton1;
        }
    }
    成年人的世界没有那么多的童话,也没有那么多的逆袭。
  • 相关阅读:
    linux学习(六)计划任务命令
    如何在在手机上安装linux(ubuntu )关键词:Termux
    linux学习(五)用户与组管理命令,以及用户信息文件解释
    linux学习(四)复制(cp)移动(mv)删除(rm)查找(find)文件、文件夹操作、软硬链接的区别
    Flutter中通过https post Json接收Json
    Api管家系列(一):初探
    Api管家系列(三):测试和Rest Client
    Api管家系列(二):编辑和继承Class
    JDK8 时间相关API基本使用
    windows杀端口
  • 原文地址:https://www.cnblogs.com/shijinglu2018/p/8604217.html
Copyright © 2020-2023  润新知