"本文介绍了Java中的单例模式,包括三种常见的实现方式:饿汉式、懒汉式和双重检查锁定(DCL)式,并分析了各自的优缺点。" 在软件设计模式中,单例模式是一种常用的创建型模式,它保证一个类只有一个实例,并提供一个全局访问点。在Java中,实现单例模式有多种方法,这里主要讨论三种常见的策略。 1. 饿汉式(静态常量初始化) 这是最简单的单例实现方式,它在类加载时就完成了初始化,因此线程安全。代码如下: ```java public class Singleton { private static final Singleton single = new Singleton(); private Singleton() {} public static Singleton getInstance() { return single; } } ``` 饿汉式的优势在于实现简单,且由于在类加载时就完成了实例化,所以不存在多线程同步问题,性能较好。但缺点是如果单例对象不被使用,内存可能会被浪费。 2. 懒汉式(线程不安全) 懒汉式在类加载时不初始化单例,而是在第一次调用`getInstance()`时才进行实例化。但这种方式在多线程环境下可能产生多个实例,如下: ```java public class Singleton { private static Singleton single = null; private Singleton() {} public static Singleton getInstance() { if (single == null) { single = new Singleton(); } return single; } } ``` 为了解决线程安全问题,通常需要对`getInstance()`方法进行同步,但这将导致性能下降。 3. 双重检查锁定(DCL)式 DCL结合了饿汉式和懒汉式的优点,确保了线程安全且延迟初始化。关键在于两次检查`single`是否为`null`,并在实例化前进行同步,如下: ```java public class Singleton { private volatile static Singleton singleton = null; private Singleton() {} public static Singleton getInstance() { if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); } } } return singleton; } } ``` DCL方式通过`volatile`关键字确保了多线程环境下的可见性和有序性,从而避免了线程安全问题,同时延迟了初始化,提高了性能。但需要注意的是,这里的`volatile`关键字非常重要,它保证了多线程环境下`singleton`变量的正确初始化。 此外,还有枚举单例、静态内部类单例等方式,它们同样能够保证单例的唯一性,并且具有良好的线程安全性。枚举单例是最推荐的方式,因为它简洁且自动处理了线程安全问题,如下: ```java public enum Singleton { INSTANCE; } ``` 总结来说,选择哪种单例模式取决于实际需求,如性能、线程安全、内存占用等因素。在Java中,通常推荐使用双重检查锁定或枚举单例方式来实现单例模式。
概念:
Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例、饿汉式单例、登记式单例。
单例模式有以下特点:
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。总之,选择单例模式就是为了避免不一致状态,避免政出多头。
一、懒汉式单例
[java] view plain copy print?在CODE上查看代码片派生到我的代码片
//懒汉式单例类.在第一次调用的时候实例化自己
public class Singleton {
private Singleton() {}
private static Singleton single=null;
//静态工厂方法
public static Singleton getInstance() {
if (single == null) {
single = new Singleton();
}
return single;
}
}
Singleton通过将构造方法限定为private避免了类在外部被实例化,在同一个虚拟机范围内,Singleton的唯一实例只能通过getInstance()方法访问。
(事实上,通过Java反射机制是能够实例化构造方法为private的类的,那基本上会使所有的Java单例实现失效。此问题在此处不做讨论,姑且掩耳盗铃地认为反射机制不存在。)
1、在getInstance方法上加同步
[java] view plain copy print?在CODE上查看代码片派生到我的代码片
public static synchronized Singleton getInstance() {
if (single == null) {
single = new Singleton();
}
return single;
}
2、双重检查锁定
[java] view plain copy print?在CODE上查看代码片派生到我的代码片
public static Singleton getInstance() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
3、静态内部类
剩余8页未读,继续阅读
- 粉丝: 10
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 李兴华Java基础教程:从入门到精通
- U盘与硬盘启动安装教程:从菜鸟到专家
- C++面试宝典:动态内存管理与继承解析
- C++ STL源码深度解析:专家级剖析与关键技术
- C/C++调用DOS命令实战指南
- 神经网络补偿的多传感器航迹融合技术
- GIS中的大地坐标系与椭球体解析
- 海思Hi3515 H.264编解码处理器用户手册
- Oracle基础练习题与解答
- 谷歌地球3D建筑筛选新流程详解
- CFO与CIO携手:数据管理与企业增值的战略
- Eclipse IDE基础教程:从入门到精通
- Shell脚本专家宝典:全面学习与资源指南
- Tomcat安装指南:附带JDK配置步骤
- NA3003A电子水准仪数据格式解析与转换研究
- 自动化专业英语词汇精华:必备术语集锦