首页主机资讯懒汉式与饿汉式单例类区别

懒汉式与饿汉式单例类区别

时间2024-09-09 19:04:03发布访客分类主机资讯浏览762
导读:懒汉式与饿汉式单例类的区别主要体现在实例化时机、线程安全性和资源利用效率上。以下是详细介绍: 实例化时机 饿汉式:在类加载时就完成了实例化,因此实例化速度快,但无论是否使用该实例,都会占用内存资源。 懒汉式:在第一次调用getInstan...

懒汉式与饿汉式单例类的区别主要体现在实例化时机、线程安全性和资源利用效率上。以下是详细介绍:

实例化时机

  • 饿汉式:在类加载时就完成了实例化,因此实例化速度快,但无论是否使用该实例,都会占用内存资源。
  • 懒汉式:在第一次调用getInstance()方法时才进行实例化,实现了延迟加载,可以有效减少资源浪费。

线程安全性

  • 饿汉式:由于实例化在类加载时已经完成,因此天然是线程安全的,不存在多线程同时创建实例的问题。
  • 懒汉式:在多线程环境下,如果不进行适当的同步,可能会导致多个线程同时创建实例,从而违反单例原则。懒汉式可以通过在getInstance()方法上加synchronized关键字或使用双重检查锁定(Double-Checked Locking)来确保线程安全。

资源利用效率

  • 饿汉式:由于实例化在类加载时完成,无论是否使用该实例,都会占用内存资源,这在资源利用上可能不够经济。
  • 懒汉式:只有在需要时才创建实例,可以有效减少资源浪费,提高资源利用效率。

示例代码

  • 饿汉式示例代码(Java):
public class HungryStyle {
    
    private static final HungryStyle instance = new HungryStyle();


    private HungryStyle() {
}


    public static HungryStyle getInstance() {
    
        return instance;

    }

}

  • 懒汉式示例代码(Java,线程安全):
public class LazyStyle {
    
    private static LazyStyle instance;


    private LazyStyle() {
}


    public static synchronized LazyStyle getInstance() {

        if (instance == null) {
    
            instance = new LazyStyle();

        }
    
        return instance;

    }

}
    

综上所述,懒汉式单例类在实例化时机、线程安全性和资源利用效率方面与饿汉式单例类有所不同。懒汉式单例类通过延迟加载实例化对象,提高了资源利用效率,但需要注意线程安全问题。饿汉式单例类则在实例化时就已经完成了对象的创建,线程安全,但可能会造成一定的资源浪费。

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: 懒汉式与饿汉式单例类区别
本文地址: https://pptw.com/jishu/698179.html
如何避免java单例类的反射攻击 单例类在多线程环境下的挑战

游客 回复需填写必要信息