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

    一个类的静态属性只会在第一次加载类时初始化
    静态变量只初始化一次
     
    懒汉式方式:
     1 //懒汉式单例
     2 public class Singleton1 {
     3     // 4 定义一个变量存储创建好的类实例
     4     // 5 要在静态方法中使用,所以需要加上static修饰
     5     private static Singleton1 instance = null;
     6     //1 私有化构造函数,在内部控制创建实例的数目
     7     private Singleton1(){}
     8     // 2 定义一个方法为客户端提供类实例
     9     // 3 需要定义成类方法,加static
    10     public static Singleton1 getInstance(){
    11         // 6 判断存储实例的变量是否有值
    12         if(instance == null){
    13             // 6.1 如果没有,就创建一个类实例,赋给存储类实例的变量
    14             instance = new Singleton1();
    15         }
    16         // 6.2 如果有值,就直接使用
    17         return instance;
    18     }
    19 }
    20 //没有经过内部类处理,这种方式最主要的缺点就是一旦我访问了Singleton1的任何其他的静态域,
    21 //就会造成实例的初始化,而事实是可能我们从始至终就没有使用这个实例,造成内存的浪费

    不加同步的懒汉式是线程不安全的。

    //饿汉式单例
    public class Singleton {
    private static Singleton singleton = new Singleton();
        
        private Singleton(){}
        
        public static Singleton getInstance(){
            return singleton;
        }
    }

    饿汉式是线程安全的,因为虚拟机只会装载一次,在装载类的时候不会发生并发。

    没有经过内部类处理,这种方式最主要的缺点就是一旦我访问了Singleton1的任何其他的静态域,就会造成实例的初始化,而事实是可能我们从始至终就没有使用这个实例,造成内存的浪费。

    改成使用静态的内部类作为单例
    public class Singleton {
        //1 私有化构造函数,内部控制创建实例的个数
        private Singleton(){}
        
        //2 定义方法为客户端提供类实例
        //3 需要定义成类方法,加static
        public static Singleton getIntance(){
            return SingletonInstace.instance;
        }
        
        //静态的内部类作为实例,一个类的静态属性只会在第一次加载类时初始化
        private static class SingletonInstace{
            static Singleton instance = new Singleton();
        }
    }

    类级内部类:有static修饰的成员式内部类。如果没有static修饰的成员式内部类成为对象级内部类。

    类级内部类相对于外部类的static成分,与外部不存在依赖关系。

    类级内部类中相当于其外部类的成员,只有在第一次被使用的时候才会被加载。

  • 相关阅读:
    OOM when allocating tensor of shape [] and type float [[node conv2d_224/kernel/Initializer/random_uniform/min (defined at ./intances/utils.py:19) ]]
    前端H5,点击选择图片控件,图片直接在页面上展示~
    (五)共用体
    (四)结构体
    (三)指针和数组
    (二)内存分配
    (一)指针就是地址
    MinGW
    设计模式总结
    Java关于md5+salt盐加密验证
  • 原文地址:https://www.cnblogs.com/xingele0917/p/6236349.html
Copyright © 2011-2022 走看看