关于Singleton总结

本文详细介绍了单例模式的概念、实现方式及其应用场景。单例模式确保一个类只有一个实例,并提供一个全局访问点。适用于需要单一实例并能全局访问的场景。

关键词解释:

Singleton是单例模式,单例模式属于对象创建型模式,其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点。

实例:‘类’在实例化后就是一个实例

出发点:

怎样才能保证一个类只有一个实例并且这个实例易于被访问,一个全局变量使得一个对象可以被访问,但它不能防止你实例化多个对象,一个更好的方法是让类自身负责保存他的唯一实例。这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法,这就是Singleton模式。


Java Singleton模式属于管理实例化过程的设计模式家族。Singleton是一个无法实例化的对象。这种设计模式暗示,在任何时候,只能由JVM创建一个Singleton(对象)实例。

如果实例不存在,你通过创建类的新实例的方法建立一个类来执行这个模式;如果存在类的一个实例,就只会返回那个对象的一个引用。


实用性:

  在下面的情况下可以使用Singleton模式

1.当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时

2.当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。

代码演示:

Singleton类:
public class Singleton {

	private static Singleton s;

	private Singleton() {
		System.out.println("A Singleton Model example");
	}

	public static Singleton getInstance() {
		if (s == null) {
			s = new Singleton();
		}
		return s;
	}
}

测试类SingletonTest:

public class SingletonTest {

	public static void main(String[] args) {
		Singleton s1 = Singleton.getInstance();
		
		System.out.println(s1.toString());
		
		for (int i = 0; i < 5; i++) {
			Singleton s2 = Singleton.getInstance();
			System.out.println("The randomed number is " + s2.toString());
		}
		
	}
}

main输出结果

A Singleton Model example
Singleton@18a992f
The randomed number is Singleton@18a992f
The randomed number is Singleton@18a992f
The randomed number is Singleton@18a992f
The randomed number is Singleton@18a992f
The randomed number is Singleton@18a992f


用法:

Singleton类的默认构造器被设为私有private,这样做可防止其它类使用new关键字直接将对象实例化。

对返回Singleton对象的实例方法应用一个静态修饰符static,这使得它成为一个类级方法,不创建对象即可进行访问。



参考文档:

http://blog.sina.com.cn/s/blog_59726b7f0100dry9.html

http://tianli.blog.51cto.com/190322/43743/


<think>我们正在讨论单例设计模式SingletonDesignPattern)的实现。单例模式确保一个类只有一个实例,并提供一个全局访问点。根据引用内容,我们可以总结几种实现方式:1.懒汉式(LazyInitialization):在第一次调用时创建实例。这种方式需要考虑线程安全。2.饿汉式(EagerInitialization):在类加载时就创建好实例,天生线程安全。3.双重检查锁(Double-CheckedLocking):在懒汉式的基础上,使用同步块和双重检查来减少同步的开销,并保证线程安全。4.静态内部类(StaticInnerClass):利用类加载机制保证线程安全,同时实现懒加载。引用中提供了几种代码示例:引用[1]展示了一个Java的懒汉式实现,使用了`synchronized`关键字来保证线程安全:```javapublicstaticsynchronizedSingletonExamplegetSingletonInstance(){if(null==singletonInstance){singletonInstance=newSingletonExample();}returnsingletonInstance;}```引用[2]展示了C++的懒汉式实现(非线程安全):```cpp#include<iostream>classSingleton{private:staticSingleton*instance;Singleton(){}//私有构造函数public:staticSingleton*getInstance(){if(instance==nullptr){instance=newSingleton();}returninstance;}};//初始化静态成员Singleton*Singleton::instance=nullptr;```引用[3]展示了Java的饿汉式实现:```javaclassSingle1{privateSingle1(){}publicstaticSingle1s=newSingle1();publicstaticSingle1getInstance(){returns;}}```同时,引用[3]也提到了懒汉式,但没有给出具体代码。另外,引用[4]给出了单例模式的定义:确保一个类只有一个实例,并提供一个全局访问点。现在,我们将详细介绍几种常见的实现方式,并注意线程安全问题。由于用户要求使用中文回答,并且要求生成相关问题,我们将按照以下步骤进行:1.解释单例模式的概念。2.分别给出不同实现方式的代码示例(包括Java和C++),并分析其优缺点。3.生成相关问题。注意:在回答中,行内数学表达式使用$...$,独立公式使用$$...$$(但本问题中可能没有数学公式,因此主要关注代码格式)。同时,在引用的地方添加引用标识。开始回答:</think>### 单例设计模式实现详解 单例模式(Singleton Pattern)确保一个类**只有一个实例**,并提供一个**全局访问点**。核心实现要点: 1. **私有构造函数**:防止外部直接实例化 2. **静态私有实例**:保存唯一实例 3. **静态公有方法**:提供全局访问入口 4. **线程安全机制**:多线程环境下保证唯一性 #### 一、基础实现方式 ##### 1. 饿汉式(Eager Initialization) **线程安全**,类加载时立即创建实例: ```java public class Singleton { // 类加载时立即初始化实例 private static final Singleton instance = new Singleton(); // 私有构造函数 private Singleton() {} public static Singleton getInstance() { return instance; } } ``` **优点**:实现简单,线程安全 **缺点**:可能造成资源浪费(未使用时也占用内存)[^3] ##### 2. 懒汉式(Lazy Initialization) **非线程安全**,首次调用时创建: ```java public class Singleton { private static Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); // 多线程下可能创建多个实例 } return instance; } } ``` #### 二、线程安全优化 ##### 1. 同步方法(线程安全懒汉式) ```java public class Singleton { private static Singleton instance; private Singleton() {} // 同步方法保证线程安全 public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } ``` **缺点**:每次调用都同步,性能开销大[^1] ##### 2. 双重检查锁(Double-Checked Locking) ```java public class Singleton { private static volatile Singleton instance; // volatile禁止指令重排 private Singleton() {} public static Singleton getInstance() { if (instance == null) { // 第一次检查 synchronized (Singleton.class) { if (instance == null) { // 第二次检查 instance = new Singleton(); } } } return instance; } } ``` **优点**:线程安全 + 高性能 **要点**:必须使用`volatile`防止指令重排导致部分初始化对象[^2] ##### 3. 静态内部类(Holder模式) ```java public class Singleton { private Singleton() {} private static class Holder { static final Singleton INSTANCE = new Singleton(); } public static Singleton getInstance() { return Holder.INSTANCE; // 首次调用时加载内部类 } } ``` **优点**:线程安全 + 懒加载 + 无同步开销(推荐方式) #### 三、应用场景与注意事项 **典型场景**: - 配置文件管理类 - 线程池/连接池 - 日志管理器 - 硬件接口访问 **注意事项**: 1. 序列化需重写`readResolve()`防止反序列化创建新实例 2. 反射攻击防护:构造函数中检查实例是否存在 3. 单例对象生命周期管理(尤其资源释放) 4. 单元测试困难(依赖全局状态)[^3] > 单例模式本质是**控制实例数量**而非创建方式,需根据实际场景选择实现方案[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值