研磨设计模式学习笔记之单例模式

本文详细介绍了单例模式的定义、结构、示例代码及其在多线程环境下的线程安全性问题。同时,阐述了懒汉式、饿汉式、双重检查加锁等实现方式,并通过类级内部类和枚举来展示更简洁高效的实现方法。

1、单例模式定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点 。   

2、单例模式结构及说明:Singleton:负责创建Singleton类自己的唯一实例,并提供一个getInstance的方法,让外部来访问这个类的唯一实例。 

3、单例模式示例代码:

  3.1 单例模式又分为饿汉式与懒汉式单例模式。

        饿与懒的区别,饿表示的是在程序加载的时候即创建一个静态实例。懒顾名思义即当在需要他的时候才会创建。

  3.2 恶汉式代码:

     

package singleton;

/**
 * 懒汉式单例模式
 * @author Administrator
 *
 */
public class SingletonSample2 {
	/**
	 * 定义一个变量来存储创建好的类的实例
	 */
	private static SingletonSample2 uniqueInstance= null;
	
	/**
	 * 私有构造方法,可以在内部控制创建实例的数目
	 */
	private SingletonSample2(){
	}

	/**
	 * 定义一个方法来为客户端提供实例
	 * @return
	 */
	public static synchronized SingletonSample2 getInstance(){
		//判断存储实例的变量是否有值
		if(null == uniqueInstance){
			//如果没有,就创建一个类实例,并把值赋给存储类实例的变量
			uniqueInstance = new SingletonSample2();
		}
		//有值就直接返回
		return uniqueInstance;
	}
	
	/**
	 * 定义自己的方法
	 */
	public void singletonOperation(){
		
	}
	
	/**
	 * 定义自己的属性
	 */
	private String singletonData;

	public String getSingletonData() {
		return singletonData;
	}
	public void setSingletonData(String singletonData) {
		this.singletonData = singletonData;
	}
	
}
测试类
public class SingletonTest {
	
	public static void main(String[] args) {
		
		SingletonSample2 s21 = SingletonSample2.getInstance();
		SingletonSample2 s22 = SingletonSample2.getInstance();
		System.out.println(s21==s22);
	}

}
测试结果:返回true


  3.2 懒汉式代码:

package singleton;

/**
 * 恶汉式单例模式
 * @author Administrator
 *
 */
public class SingletonSample1 {
	
	/**
	 * 定义一个变量来存储创建好的类的实例,直接在这里创建类的实例,只能创建一次
	 */
	private  static  SingletonSample1 uniqueInstance= new SingletonSample1();
	
	/**
	 * 私有构造方法,可以在内部控制创建实例的数目
	 */
	private SingletonSample1(){
	}

	/**
	 * 定义一个方法来为客户端提供实例
	 * @return
	 */
	public static SingletonSample1 getInstance(){
		return uniqueInstance;
	}
	

	/**
	 * 定义自己的方法
	 */
	public void singletonOperation(){
		
	}
	
	/**
	 * 定义自己的属性
	 */
	private String singletonData;

	public String getSingletonData() {
		return singletonData;
	}
	public void setSingletonData(String singletonData) {
		this.singletonData = singletonData;
	}
}

4、单例模式线程安全性:不加同步的懒汉式是线程不安全的,在多线程的环境中可能会导致并发问题。而饿汉式是线程安全的,因为虚拟机保证只会装载一次,在装载类的时候不会发生并发的。

  4.1 如何实现懒汉式线程安全呢? 当然可以直接在getInstance()方法上加上synchronized关键字。但这样就会降低整个访问的速度,而且每次都要判断。故出现了双重检查加锁。

  4.2 双重检查加锁机制:指的是并不是每次进入getInstance方法都需要同步,而是先不同步,进入方法过后,先检查实例是否存在,如果不存在才进入下面的同步块,这是第一重检查。进入同步块过后,再次检查实例是否存在如果不存在,就在同步块的情况下创建一个实例,这就是第二重检查。这样一来,就只需要同步一次了。从而减少了多次在同步的情况下进行的判断而浪费的时间。 不多说,上代码。

package singleton;

/**
 * 双重检查加锁懒汉式单例模式
 * @author Administrator
 *
 */
public class SingletonSample3 {
	/**
	 * 定义一个变量来存储创建好的类的实例需添加volatile修饰
	 */
	private volatile static SingletonSample3 uniqueInstance= null;
	
	/**
	 * 私有构造方法,可以在内部控制创建实例的数目
	 */
	private SingletonSample3(){
	}

	/**
	 * 定义一个方法来为客户端提供实例
	 * @return
	 */
	public static SingletonSample3 getInstance(){
		//判断存储实例的变量是否有值
		if(null == uniqueInstance){
			//同步块,线程安全地创建实例
			synchronized (SingletonSample3.class) {
				//再次检查实例是否存在,如果不存在才真正的创建实例
				if(null == uniqueInstance){
					uniqueInstance = new SingletonSample3();
				}
			}
		}
		//有值就直接返回
		return uniqueInstance;
	}
	
	/**
	 * 定义自己的方法
	 */
	public void singletonOperation(){
		
	}
	
	/**
	 * 定义自己的属性
	 */
	private String singletonData;

	public String getSingletonData() {
		return singletonData;
	}
	public void setSingletonData(String singletonData) {
		this.singletonData = singletonData;
	}
	
}
(建议双重检查加锁用在java5及以上版本。)

5、单例模式的更好实现方式:类级内部类。

  5.1 类级内部类:有static修饰的成员式内部类。如果没有static修饰的成员内部类被称为对象内部类。

  5.2 多线程缺省同步锁。

         在多线程开发中,为了解决并发问题,主要是通过使用synchronized来加互斥锁进行同步控制。但是某些情况中,虚拟机已经隐含地为您执行了同步,这些情况就不用直接再来进行同步控制了。这些情况包括:

  • 由静态初始化器(在静态字段上或static{}块中的初始化器)初始化数据时
  • 访问final字段时
  • 在创建线程之间创建对象
  • 线程可以看见它要处理的对象时

   5.3 更为简单的实现单例模式实例代码

package singleton;

/**
 * 双重检查加锁懒汉式单例模式
 * @author Administrator
 *
 */
public class SingletonSample4 {
	/**
	 * 类级内部类
	 * 没有绑定关系,而且只有在调用的时候才会加载,从而实现了延迟加载
	 */
	private static class SingletonHolder{
		/**
		 * 静态初始化器,由JVM来保证线程安全
		 */
		private static SingletonSample4 instance = new SingletonSample4();
	}
	
	public static SingletonSample4 getInstance(){
		return SingletonHolder.instance;
	}
	
	/**
	 * 私有构造方法
	 */
	private SingletonSample4(){
	}
	/**
	 * 定义自己的方法
	 */
	public void singletonOperation(){
		
	}
	
	/**
	 * 定义自己的属性
	 */
	private String singletonData;

	public String getSingletonData() {
		return singletonData;
	}
	public void setSingletonData(String singletonData) {
		this.singletonData = singletonData;
	}
	
}
6、还有种更为简洁,高效,安全的实现单例方法---通过枚举来显示单例模式。

package singleton;

public enum SingletonSample5 {
	/**
	 * 定义一个枚举元素,它就代表了Singleton的一个实例
	 */
	uniqueInstance;
	
	/**
	 * 自定义方法
	 */
	public void singletonOperation(){
		
	}

}

以上是单例的模式的几种不同的实现方式,与大家一同学习。


Little progress every day!











已经博主授权,源码转载自 https://pan.quark.cn/s/fdfcb1303993 ### 高速电路接口原理与应用详解 #### 引言 信息技术的迅猛进步推动了高速数据传输需求的持续提升,特别是在高性能计算、网络通信等关键领域。为了达成高效的数据交换,高速集成电路间的互连技术成为了研究的热点。本文将系统阐述几种典型的高速接口规范——PECL(Positive Emitter Coupled Logic)、LVECL(Low Voltage Emitter Coupled Logic)、CML(Current Mode Logic)和LVDS(Low Voltage Differential Signaling),并深入分析它们的电路构造和应用特性。 #### 1. ECL电路基础 ECL电路是早期为应对高速数据传输需求而研发的一种逻辑电路,其运行速度极快,最高可达到10Gbps。通过维持晶体管工作于线性和截止区域,ECL电路有效规避了饱和区的影响,从而获得了迅速的开关响应。接下来将具体解析ECL电路的构成要素及其运作机制。 #### 1.1 ECL线接收器电路组成 - **差分放大器**:由晶体管Q3、Q4、Q5构成,是整个电路的核心部分。其中,Q5作为恒流源,具备较大的交流等效电阻,能够提供稳定的电流,确保电路的稳定运作。 - **发射极跟随器输出电路**:由Q1、Q2组成,主要用于电平调整和输出驱动,确保输出信号与下一级电路的兼容性。 - **偏置电源**:由Q6、Q7以及二极管D1、D2构成,为差分放大器提供可靠的偏置电压,使其始终工作在线性放大区间。 #### 1.2 ECL电路的显著特性 - **高运行速率**:由于晶体管工作在线性和截止状态,不受...
源码直接下载地址: https://pan.quark.cn/s/27dcad4290ca Silicon Labs(前身为Silicon Laboratories)为其USB至UART转换控制器开发了一款官方驱动程序,即CP210x驱动,该驱动程序在Windows 10操作系统上表现出色。此驱动确保计算机能够识别并有效通信与使用配备CP210x芯片的设备,包括开发板、模块或USB转串口适配器。CP2012作为CP210x系列中的一个型号,同样受益于该驱动程序的支持。驱动程序版本v6.7.3代表一个较新的升级,其目标在于解决兼容性挑战,增强性能并提升稳定性。"win10"标签突出了该驱动对Windows 10系统的优化及兼容性,暗示用户在Windows 10环境下可以无障碍地运用CP210x设备。压缩包内含的文件如下: 1. `slabvcp.cat`:作为验证文件,用于核实驱动程序的数字签名,确保驱动源自可信渠道且未被篡改。 2. `CP210xVCPInstaller_x64.exe` 和 `CP210xVCPInstaller_x86.exe`:这两个安装程序分别针对64位和32位的Windows系统设计,用户需依据自身操作系统选择适配版本进行安装。 3. `slabvcp.inf`:作为驱动配置文档,其中包含驱动程序的安装参数,Windows系统将依据此文件进行驱动安装与配置。 4. `SLAB_License_Agreement_VCP_Windows.txt`:作为许可文件,用户在安装前须仔细阅读并确认同意其中的条款。 5. `dpinst.xml`:该部署脚本旨在简化驱动安装流程,自动化安装过程以确保驱动正确部署至系统。 6. `x86` 和 `x64...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值