一、懒汉式(Lazy Initialization)
懒汉式是指在需要调用时才去创建单例对象,而不是在程序运行时就创建好,以达到延迟加载的效果。
1、优点
懒汉式可以避免在程序启动时就创建单例对象,从而降低系统的开销。如果单例对象很大或者需要一定时间才能创建,那么懒汉式会比较有优势。
2、缺点
懒汉式也有一些缺点。首先,多线程环境下,需要使用同步锁来保证线程安全,这会导致性能下降。其次,如果有多个类加载器,那么会存在不同类加载器加载了不同的单例对象的情况。
3、代码实现
public class LazySingleton { private static LazySingleton instance; private LazySingleton() {} public static synchronized LazySingleton getInstance() { if (instance == null) { instance = new LazySingleton(); } return instance; } }
二、饿汉式(Eager Initialization)
饿汉式是指在程序运行时就创建好单例对象,并且在整个程序周期内都会存在。
1、优点
饿汉式可以避免多线程环境下的同步问题,因为单例对象在程序运行时就已经创建好了。同时在单例对象很小且不需要延迟加载的情况下,使用饿汉式也比较合适。
2、缺点
饿汉式也有一些缺点。首先,如果单例对象比较大,那么在程序启动时就会占用较多的内存空间。其次,如果单例对象的初始化需要很长的时间,那么程序启动时的等待时间会变长。
3、代码实现
public class EagerSingleton { private static final EagerSingleton instance = new EagerSingleton(); private EagerSingleton() {} public static EagerSingleton getInstance() { return instance; } }
三、懒汉式与饿汉式的比较
1、线程安全
懒汉式需要使用同步锁来保证线程安全,而饿汉式本身就是线程安全的。
2、是否延迟加载
懒汉式是延迟加载的,而饿汉式是立即加载的。
3、系统开销
懒汉式可以避免在程序启动时就创建单例对象,从而降低系统的开销。而饿汉式会在程序启动时就创建单例对象,如果单例对象很大或需要一定时间才能创建,那么会造成一定的系统开销。
4、不同类加载器加载的问题
如果有多个类加载器,那么懒汉式会存在不同类加载器加载了不同的单例对象的情况。而饿汉式不存在这个问题。
原创文章,作者:CPNGR,如若转载,请注明出处:https://www.506064.com/n/367936.html