单例模式详解

一、概述

单例模式的定义就是确保某一个类只有一个实例,并且提供一个全局访问点
单例模式具有典型的三个特点:

  • 只有一个实例。
  • 自我实例化。
  • 提供全局访问点。

常见的单例模式实现方式有五种:饿汉式、懒汉式、双重检测锁式、静态内部类式和枚举单例。而在这五种方式中饿汉式和懒汉式又最为常见,下面就对饿汉式和懒汉式进行详细分析。

二、代码剖析

1.懒汉式

public class Singleton {
	//2.本类内部创建对象实例
	private static Singleton instance = null;
    // 1.构造方法私有化,外部不能new
	private Singleton() {
 
	}
   //3.提供一个公有的静态方法,返回实例对象
	public static Singleton getInstance() {
		if (instance == null) {
			instance = new Singleton();
		}
		return instance;
	}
 
}

单例模式的懒汉式体现了缓存的思想,延时加载就是一开始不要加载资源或者数据,一直 等,等到马上就要使用这个资源的或者数据了,躲不过去了才去加载。
懒汉式是定性的时间换空间,不加同步的懒汉式是线程不安全的,如何实现线程安全的懒汉式(双重检查加锁):

public class Singleton {
	private volatile static Singleton instance = null; 
	// 私有化构造方法
	private Singleton() {
 
	}
	public static Singleton getInstance() {
		if (instance == null) {
			synchronized (Singleton.class) {
				if (instance == null) {
					instance = new Singleton();
				}
			}
		}
		return instance;
	} 
}

总而言之,由于该模式是在运行时加载对象的,所以加载类比较快,但是对象的获取速度相对较慢,且线程不安全,如果想要线程安全的话可以加上synchronized关键字,但是这样会付出惨重的效率代价。
2.饿汉式

public class Singleton {
	private static Singleton instance = new Singleton();
	// 私有化构造方法
	private Singleton() {
	}
	public static Singleton getInstance() {
		return instance;
	}
}

饿汉式是典型的空间换时间,当类装载的时候就会创建类实例,不管你用不用,先创建出来,然后每次调用的时候,就不需要判断了,节省了运行时间。

三、使用场景

1、任务管理器就是很典型的单例模式,比如不能打开两个windows task manager。
2、(回收站)也是典型的单例应用。在整个系统运行过程中,回收站一直维护着仅有的一个实例。
3、网站的计数器,一般也是采用单例模式实现,否则难以同步。
4、数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库资源。数据库软件系统中使用数据库连接池,主要是节省打开或者关闭数据库连接所引起的效率损耗,这种效率上的损耗还是非常昂贵的,因为何用单例模式来维护,就可以大大降低这种损耗。
5、多线程的线程池的设计一般也是采用单例模式,这是由于线程池要方便对池中的线程进行控制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值