【设计模式】单列模式

一、单列模式
我们可以让一个全局变量是得一个对象被访问,但它不能防止实例多个对象,一个最好的办法就是让类本身负责保存它的唯一实例,这个类可以保证没有其他实例可以创建。

单列模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点
class Singleton{
private static Singleton instance;
private Singleton() {
//构造方法让其private,堵死外界利用new创建此类实例的可能
}
public static Singleton GetInstance() {
if(instance==null) {
instance=new Singleton();
}

单列模式因为Singleton类封装它的唯一实例,这样它可以严格的控制客户怎样访问它,如何访问它。
客户端代码
public class dl {

public static void main(String[] args) {
	// TODO Auto-generated method stub
     Singleton s1=Singleton.GetInstance();
     Singleton s2=Singleton.GetInstance();
     if(s1==s2) {//比较两次实例化后对象,结果是相同的
    	 System.out.println("相同实例");
     }
}

}

二、多线程时的单列
多线程的单列,同时调用是可能创建多个实例的。
加一把锁,lock是确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定代码,则它将一直等待,直到该对象被释放。

class Singleton{
private static Singleton instance;
private static readonly object syncRoot=new object();//程序运行时创建一个静态的只读的进程辅助对象。
private Singleton() {
}
public static Singleton GetInstance() {
lock(syncRoot){//在同一个时刻加了锁的那一部分程序只有一个线程进入
if(instance==null) {
instance=new Singleton();
}
}
}
return instance;
}
}
三、双重锁定

class Singleton{
private static Singleton instance;
private static readonly object syncRoot=new object();
private Singleton() {
}
public static Singleton GetInstance() {
if(instance== null) {
lock(syncRoot){
if(instance== null) {
instance=new Singleton();
}
}
}
//不让线程每次都加锁,只是在实例未创建的时候加锁处理,保证线程安全。
return instance;
}
}

### Java 中单例设计模式的实现和用法 #### 单例模式的优势 在Java中,单例模式通过确保一个类只有一个实例并提供全局访问点来简化程序的设计。相比于静态类,单例模式提供了更大的灵活性,因为可以延迟初始化,并且可以在运行时更改行为或状态[^1]。 #### 实现方式及其线程安全性 为了处理多线程环境下的并发问题,在早期版本的Java内存模型存在缺陷的情况下,Bill Pugh提出了基于内部静态辅助类的方式来创建单例类。这种方式不仅解决了多个线程同时获取单例实例的问题,还利用了JVM加载机制保证了懒加载特性以及良好的性能表现[^2]。 具体来说,当外部尝试访问`getInstance()`方法时,只有第一次调用才会触发内部静态类的加载过程从而完成对象构建;之后每次请求都将直接返回已经存在的唯一实例。这种做法有效防止了由于指令重排序带来的潜在风险——即所谓的out-of-order writes现象[^5]。 以下是采用上述方案的一个典型例子: ```java public class Singleton { private Singleton() {} private static class SingletonHelper { private static final Singleton INSTANCE = new Singleton(); } public static synchronized Singleton getInstance() { return SingletonHelper.INSTANCE; } } ``` 此代码片段展示了如何定义私有构造函数阻止外界随意新建对象的同时,借助于嵌套的静态成员类实现了安全高效的单例模式。 #### 关键要点总结 - **延迟初始化**:直到真正需要的时候才创建唯一的实例。 - **线程安全**:即使面对高并发场景也能保持数据一致性。 - **资源节约**:减少不必要的重复开销,提高应用效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值