1.懒汉式
public class HungryMan { private HungryMan(){} private static HungryMan hungryMan = new HungryMan(); public static HungryMan getInstance(){ return hungryMan; } }
优点:简单方便
缺点:无论是否会用到,都会实例化,而且在类加载时就实例化,降低程序启动速度。
2.饿汉式
public class LazyMan { private static LazyMan lazyMan = null; private LazyMan() { } public static LazyMan getInstatce() { if (lazyMan == null) { lazyMan = new LazyMan(); } return lazyMan; } }
优点:在使用时才会生成对象,能够减少内存开销。
缺点:线程不安全,只适用单线程,当有多个线程访问时,能够产生多个对象,不满足单例模式的要求。
3.懒汉式同步锁
public class LazyMan { private static volatile LazyMan lazyMan = null; private LazyMan() { } public static LazyMan getInstatce() { synchronized (LazyMan.class){ if (lazyMan == null) { lazyMan = new LazyMan(); } } return lazyMan; } }
优点:支持多线程;
缺点:每次都会加锁和释放锁操作,效率低,可通过反射破坏单例模式。
4.饿汉式双重校验锁(既加锁又判空)
public class LazyMan { private static volatile LazyMan lazyMan = null; private LazyMan() { } public static LazyMan getInstatce() { if(lazyMan == null){ synchronized (LazyMan.class){ if (lazyMan == null) { lazyMan = new LazyMan(); } } } return lazyMan; } }
优点:效率高,线程安全。
缺点:代码复杂,可通过反射破坏单例模式。
5.静态内部类
public class SingleStatic { private SingleStatic() { } private static class SingleB { public static SingleStatic singleStatic = new SingleStatic(); } public static SingleStatic getInstance() { return SingleB.singleStatic; } }
优点:使用时才会加载,而且静态内部变量只加载一次所以线程安全;
缺点:代码变得复杂,apk文件增大。
6.枚举类
public enum SingleTon { SINGLE_TON; private String field; public String getField() { return field; } public void setField(String field) { this.field = field; } }
优点:线程安全,不用担心反射破坏单例模式。
缺点:枚举类占用内存多。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探