单例模式通过限制类的实例数量为一个并提供全局访问点来确保唯一性。饿汉式在类加载时创建实例,简单且线程安全,但可能造成资源浪费;懒汉式使用双重检查锁定实现延迟加载和线程安全,需配合volatile关键字防止指令重排序;静态内部类方式利用类加载机制实现懒加载与线程安全,代码简洁高效,推荐使用;枚举方式最安全,可防止多线程问题、反射攻击及反序列化破坏,尤其适用于需要序列化的场景,是Effective Java推荐的最佳实践之一。选择实现方式应根据是否需要懒加载、序列化支持及性能要求综合判断,其中静态内部类和枚举最为常用且推荐。

单例模式确保一个类只有一个实例,并提供一个全局访问点。在Java中实现单例模式有多种方式,每种都有其适用场景和优缺点。下面介绍几种常见的实现方法。
饿汉式(线程安全)
在类加载时就创建实例,简单且线程安全,但无论是否使用都会创建对象,可能造成资源浪费。
public class Singleton { private static final Singleton INSTANCE = new Singleton(); private Singleton() {} public static Singleton getInstance() { return INSTANCE; }}
这种方式适合实例创建开销不大、一定会用到的场景。
懒汉式(双重检查锁定)
延迟初始化,只在第一次调用时创建实例,同时保证线程安全,适用于多线程环境。
立即学习“Java免费学习笔记(深入)”;
public class Singleton { private static volatile Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; }}
注意:必须使用 volatile 关键字防止指令重排序,确保多线程下的正确性。
启科网络PHP商城系统
启科网络商城系统由启科网络技术开发团队完全自主开发,使用国内最流行高效的PHP程序语言,并用小巧的MySql作为数据库服务器,并且使用Smarty引擎来分离网站程序与前端设计代码,让建立的网站可以自由制作个性化的页面。 系统使用标签作为数据调用格式,网站前台开发人员只要简单学习系统标签功能和使用方法,将标签设置在制作的HTML模板中进行对网站数据、内容、信息等的调用,即可建设出美观、个性的网站。
0 查看详情
静态内部类(推荐)
利用类加载机制保证线程安全,同时实现懒加载,代码简洁且高效。
public class Singleton { private Singleton() {} private static class Holder { private static final Singleton INSTANCE = new Singleton(); } public static Singleton getInstance() { return Holder.INSTANCE; }}
只有在调用 getInstance() 时才会加载内部类,从而创建实例,兼顾了性能和安全。
枚举方式(防反射攻击)
最安全的实现方式,不仅能防止多线程问题,还能防止反序列化和反射破坏单例。
public enum Singleton { INSTANCE; public void doSomething() { System.out.println("执行操作"); }}
使用 Singleton.INSTANCE.doSomething(); 调用方法。Effective Java 推荐此方式,尤其在需要序列化的场景。
基本上就这些常见写法。选择哪种方式取决于是否需要懒加载、是否涉及序列化、对性能的要求等因素。静态内部类和枚举是最常用且推荐的方式。
以上就是如何在Java中使用单例模式的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/868370.html
微信扫一扫
支付宝扫一扫