zoukankan      html  css  js  c++  java
  • 单例模式(懒汉式、饿汉式)

    .单例模式

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

    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;
        }
    }
    成年人的世界没有那么多的童话,也没有那么多的逆袭。
  • 相关阅读:
    Winform 打包,卸载程序制作获取ProductCode
    委托/事件的重写
    反序列化无法找到程序集
    Control.Invoke注意事项
    操作config文件
    MemoEdit自动滚动到结尾
    读取局域网内的共享文件
    命令行卸载程序
    获取执行程序的路径
    SCSF 系列:使用 Visualizer 监控 SCSF 运行状态
  • 原文地址:https://www.cnblogs.com/shijinglu2018/p/8604217.html
Copyright © 2011-2022 走看看