单例模式的6种实现方式
单例模式是 Java 中最简单,也是最基础,最常用的设计模式之一。
通过单例模式的方法创建的类在当前进程中只有一个实例。在类内部创建自己的实例,并对外提供一个返回其单例对象的方法。单例模式的实现方式有懒汉式、饿汉式和枚举等。
public class Singleton { private static final Singleton INSTANCE = new Singleton(); /** * 构造函数私有化 */ private Singleton() { } public static Singleton getInstance() { return INSTANCE; } }public class Singleton { private static final Singleton INSTANCE; //静态代码块 static { INSTANCE = new Singleton(); } /** * 构造函数私有化 */ private Singleton() { } public static Singleton getInstance() { return INSTANCE; } }public class SingleLazy { private static SingleLazy INSTANCE; private SingleLazy() { } /** * 加上synchronized实现线程同步 */ public synchronized static SingleLazy getInstance() { if (INSTANCE == null) { INSTANCE = new SingleLazy(); } return INSTANCE; } }将synchronized加在对象上,提高执行效率,需要加上双重校验;
public class SingleLazy { /** * 加上volatile防止指令重排序 */ private static volatile SingleLazy INSTANCE; private SingleLazy() { } public static SingleLazy getInstance() { if (INSTANCE == null) { synchronized (SingleLazy.class) { //加上双重校验 if (INSTANCE == null) { INSTANCE = new SingleLazy(); } } } return INSTANCE; } }特点:加载外部类时不加载内部类,实现懒加载,由JVM保证单例;
public class SingleLazyInner { private SingleLazyInner() { } /** * 静态内部类,外部类加载时不会加载内部类 */ private static class SingleManager { private static final SingleLazyInner INSTANCE = new SingleLazyInner(); } public static SingleLazyInner getInstance() { return SingleManager.INSTANCE; } }总结:
懒汉式最为简单实用且线程安全;静态内部类方式实现了懒加载,比懒汉式更节省空间;饿汉式如果不加锁无法保证线程安全,如果加锁会一定程度上影响效率,较为复杂;枚举式比较简洁,且防止反序列化,设计上最完美。
设计模式(一)单例模式
最新推荐文章于 2025-04-27 11:08:50 发布
单例模式&spm=1001.2101.3001.5002&articleId=108075619&d=1&t=3&u=558ecc3c2b014e409b8c46d16702d501)
887

被折叠的 条评论
为什么被折叠?



