首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java设计模式之单例模式

类在加载时就初始化了,会浪费空间,因为不管你用还是不用,它都创建出来了,但是因为没有加锁,执行效率较高。...懒汉式,在其加载对象的时候是不会创建对象实例的,只有等它真正使用的时候才会创建,如果一直没有使用则一直不会创建,能够避免内存浪费,也就是只有第一次调用的时候才会创建。...但是加锁synchronized就影响了性能和效率,导致getInstance方法的性能受影响,此种方式也不推荐。寻找一种既能线程安全又可以延迟加载的方式。...双检查加锁,旨在每次调用getInstance方法都需要同步,但是先不会同步,在第一次判断实例是否存在后,如果不存在才进入同步块,进入同步块后,第二次检查实例是否存在,如果不存在,在同步块内创建实例。...总结 不建议使用懒汉式,简单的阔以使用饿汉式。涉及到反序列化创建对象时阔以使用枚举方式。如果考虑到延迟加载 的话,阔以采用静态内部类Holder的模式。

50340

Java单例模式8种方式 详解

public static Singleton_Hunger1 getInstance() { return INSTANCE; } } 饿汉式(静态常量): 线程稳定 不会延迟加载...缺点:在类装载的时候就完成实例化,没有达到延迟加载的效果。如果从始至终从未使用过这个实例,则会造成内存的浪费。...Singleton_Pattern getInstance() { return SingletonInstance.INSTANCE; } } 静态内部类: 线程稳定 延迟加载...但静态内部类则可以达到延迟加载的效果,在Singleton_Pattern类被装载的时候并不会马上实例化,而是在需要实例化的时候再调用getInstance方法实例化,这样才会装载静态内部类SingletonInstance...类的静态属性只会在第一次加载类的时候初始化,如此在类初始化的时候其他进程是无法进入的,从而保护了线程的安全。 总结为:避免了线程不安全,延迟加载,效率高。

1K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    怎样为你的 Vue.js 单页应用提速

    延迟加载组件可以节省大量的初始下载时间。.../ModalDialog.vue') } } Webpack 将为 ModalDialog 组件创建一个单独的块,该块不会在页面加载时立即下载,而是仅在需要时才下载...延迟加载路由 构建 SPA 时,JavaScript 捆绑包可能会变得很大,从而增加页面加载时间。如果我们可以将每个路由的组成部分拆分为一个单独的块,然后仅在访问路由时才加载它们,则效率会更高。...延迟加载的块和预取缓存 Vue 有一个很酷的功能就是 Vue 自动添加 Webpack 的魔术注释 (https://webpack.js.org/api/module-methods/#magic-comments...总结 在本文中,我们了解了如何对路由和组件使用延迟加载以将 SPA 分成多个块,功能组件如何提高性能以及如何衡量这些改进。

    2.8K10

    面试官,你的单例模式能保证百分之百单例吗?

    懒汉式 需要时再创建,关键在于“懒”,类似懒加载。...该方式通过缩小同步范围提高访问性能,同步代码块控制并发创建实例。...静态内部类不会自动随着外部类的加载和初始化而初始化,它是要单独加载和初始化的。因为我们的单例对象是在内部类加载和初始化时才创建的,因此它是线程安全的,且实现了延迟初始化。...常量类可被继承修改、增加字段等,容易导致父类的不兼容。...方式 优点 缺点 饿汉式 - 静态变量 线程安全,访问性能高 不能延迟初始化 饿汉式 - 静态代码块 线程安全,访问性能高,支持额外操作 不能延迟初始化 懒汉式 访问性能高,延迟初始化 非线程安全 懒汉式

    71120

    探索单例模式的奥秘

    示例 单例的实现共有以下几种方式: 3.1 饿汉式 饿汉式的单例实现比较简单,其在类加载的时候,静态实例instance 就已创建并初始化好了。...public static HungrySingleton getInstance() { return instance; } } 优点:线程安全 缺点:不支持延迟加载...(延迟加载可以节省内存) 3.2 懒汉式 懒汉式将对象的初始化延迟到获取实例的时候,为了保证线程安全添加了锁。...3.3 双重检查 双重检查将懒汉式中的方法锁改为块锁,再次调用时不会进入synchronized代码块中。...缺点:一次加载反应稍慢。 3.4 静态内部类 使用Java静态内部类的特性:Java 加载外部类的时候,不会创建内部类的实例,只有在外部类使用到内部类的时候才会创建内部类实例。

    16300

    解锁设计模式的神秘面纱:编写无懈可击的代码之单例设计模式

    特点线程安全性在加载的时候已经被实例化,所以只有这一次,线程安全的懒加载没有延迟加载,好长时间不使用,影响性能示例:// 没有延迟加载,好长时间不使用,影响性能public class test1 {/...如果一个类中都是比较重的资源,这种方式就比较不妥懒汉模式所谓懒汉式就是在使用时再去创建,可以理解成懒加载。...同时避免了每次都需要进入同步代码块 if (instance == null) { // 只有一个线程能够获取到锁 synchronized (test2.class) { // 如果为Null在创建...完成对instance的初始化,随后的线程再次进入同步代码块之后,因为 instance == null 不成立,就不会再次创建,这是未加载情况下并行的场景,而instance加载完成后,再有线程进入getInstance...因为静态内部类不会主动加载,只有主类被使用时才会加载,这也就保证了程序运行时并不会直接创建一个instance而浪费内存,当我们主动引用Holder时,才会创建instance实例,从而保证了懒加载。

    40050

    一篇通俗易懂的文章让你彻底了解设计模式中的单例模式

    本类内部创建实例 private static Singleton instance; static{//静态代码块中创建单例对象 instance = new Singleton...但是效率太低了,没个线程想要获得类的实例的时候,执行getInstance()方法都要进行同步,而这个方法只执行一次实例化就够了,后面再想要获取实例直接return即可看,方法进行同步效率太低 不推荐使用...5.懒汉式(同步代码块,线程不安全) class Singleton { // 本地内部创建静态实例 private static Singleton singleton; /...线程安全、延迟加载、效率较高推荐使用 7.静态内部类 class Singleton{ // 本地内部创建静态实例 private static Singleton instance;...i,所以在这里JVM保证了线程的安全性 优点:避免了线程不安全,利用静态内部类特点实现延迟加载,效率高 8.枚举 enum Singleton{ INSTANCE;// 属性 public

    22020

    单例设计模式解读

    方法进行同步效率太低 3) 结论:在实际开发中,不推荐使用这种方式 懒汉式(线程安全,同步代码块) class Singleton{ private static Singleton instance...不推荐使用 懒汉式(线程安全,同步代码块,双重检查) class Singleton{ private static Singleton instance; private Singleton...2) 这样,实例化代码只用执行一次,后面再次访问时,判断 if (singleton == null),直接 return 实例化对象,也避免的反复进行方法同步. 3) 线程安全;延迟加载;效率较高...4) 优点:避免了线程不安全,利用静态内部类特点实现延迟加载,效率高 结论:推荐使用 枚举 enum Singleton{ INSTANCE; public void sayOK(...不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象。

    23640

    小米二面:JVM 触发类加载的条件有哪些?我说 new 的时候加载,然后他对我笑了笑......

    根据《Java 虚拟机规范》,以下六种情况会触发类的主动引用,也就是触发类加载的条件! 1. 创建类的实例 当你使用 new 关键字创建一个类的实例时,JVM 会立即加载并初始化该类。...加载 MyClass 类的字节码,并执行静态代码块和静态变量赋值操作。 2. 访问类的静态字段或静态方法 访问类的静态字段或静态方法时,也会触发类的加载和初始化。...被动引用:不触发类加载 与主动引用相对,被动引用是指访问类的某些特性时不会触发类的加载和初始化。...// 不触发 MyClass 的加载 MyClass[] array = new MyClass[10]; 码哥,为什么需要关注类加载的时机?...避免类的过早加载:过早加载可能导致不必要的内存消耗,尤其在大型应用中。 延迟加载(Lazy Loading):通过延迟加载,可以在真正需要时才加载类,减少启动时间。

    8510

    JAVA知识基础(四):深入理解static关键字

    在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。 为什么说static块可以用来优化程序性能,是因为它的特性:只会在类加载的时候执行一次。...static变量值在类加载的时候分配空间,以后创建类对象的时候不会重新分配。赋值的话,是可以任意赋值的!...5、静态代码块 静态代码块定义在类中方法外, 静态代码块在非静态代码块之前执行(静态代码块—非静态代码块—构造方法)。 该类不管创建多少对象,静态代码块只执行一次....这种方式不仅具有延迟初始化的好处,而且由 JVM 提供了对线程安全的支持。...访问静态变量和静态方法的两种方法: 静态变量: 类名.静态变量 对象.静态变量(不推荐) 静态方法: 类名.静态方法 对象.静态方法(不推荐) 静态成员变量虽然独立于对象,但是不代表不可以通过对象去访问

    37320

    Java单例模式

    它的好处是只在类加载的时候创建一次实例,不会存在多个线程创建多个实例的情况,避免了多线程同步的问题。它的缺点也很明显,即使这个单例没有用到也会被创建,而且在类加载之后就被创建,内存就被浪费了。...但是,如果单例占用的内存比较大,或单例只是在某个特定场景下才会用到,使用饿汉模式就不合适了,这时候就需要用到懒汉模式进行延迟加载。 优点 线程安全,获取实例速度快。...只在类加载的时候创建一次实例,不会存在多个线程创建多个实例的情况,避免了多线程同步的问题。 缺点 占用资源,类加载即初始化实例,内存浪费。 3.2 懒汉模式 懒汉模式就是延迟加载,也叫懒加载。...和饿汉模式一样,是靠JVM保证类的静态成员只能被加载一次的特点,这样就从JVM层面保证了只会有一个实例对象。那么问题来了,这种方式和饿汉模式又有什么区别呢?不也是立即加载么?...它是在内部类里面去创建对象实例,这样的话,只要应用中不使用内部类,JVM就不会去加载这个单例类,也就不会创建单例对象,从而实现懒汉式的延迟加载。也就是说这种方式可以同时保证延迟加载和线程安全。

    9410

    【DB笔试面试683】在Oracle中,什么是ORA-01555错误?

    ORA-01555错误的另外一个原因是延迟块清除(Delayed Block Clean out)。当一个查询触发延迟块清除时,Oracle需要去查询回滚段获得该事务的提交SCN。...如果事务的前镜像(Before Image)信息已经被覆盖,并且查询SCN也小于回滚段中记录的最小提交SCN,那么Oracle将无从判断查询SCN和事务提交SCN的大小,此时出现延迟块清除会导致ORA-...还有一种导致ORA-01555错误的情况出现在使用SQL*Loader直接方式加载(direct=true)数据时,由于不产生Redo和Undo信息,Oracle直接指定CACHED COMMIT SCN...进行加载数据,在访问这些数据时,有时会产生ORA-01555错误。...,这时可以考虑使用手动管理,为某些大作业创建单独的回滚段。

    1.1K10

    给大忙人写的单例模式的八种实现方法

    实际开发中,不推荐使用。...(用到才会创建,用不到就不会创建),但是只能在单线程下使用; 2、如果在多线程下,一个线程进入了if (singleton == null)判断语句块,还未来得及往下执行,另一个线程也通过了这个判断语句...结论: 在实际开发中效率太低了,不推荐使用这种方式。...结论: 保证了线程安全;延迟加载;效率较高; 在实际开发中,推荐使用这种方式。...而是在需要实例化的时候,调用内部类的变了时,才会被装载,从而完成SingLeton类的实例化; 优点:避免了线程不安全,利用静态内部类特点实现延迟加载,效率高; 结论: 避免了线程不安全,利用静态内部类特点实现延迟加载

    36120
    领券