什么是单例模式?
单例模式:确保一个类只有一个实例,并提供一个全局访问点。
使用场景:
线程池(threadpool),缓存(cache),对话框,处理偏好设置和注册表(registry)的对象,日志对象,充当打印机,显卡等设备的驱动程序的对象。 事实上这类对象只能有一个实例,如果制造出多个实例,就会导致许多问题产生。例如:程序的行为异常、资源使用过量,或者是不一致的结果。
经典单例模式实现:
public class Singleton{
private static Singleton uniqueInstance;
private Singleton() {}
public static Singleton getSingleton() {
if (uniqueInstance== null) {
uniqueInstance = new Singleton();
}
return uniqueInstance ;
}
//其它有用的方法
}
咋一看上面代码已实现单例模式定义的两个条件: 1.只有一个实例(private static SingleTon uniqueInstance) 2.提供了一个全局访问点( public static getSingleton() )
问题来了:当是多线程的情况怎么办呢?具体问题就不多说了,就是代码方法调用的先后顺序,对应的业务就不对了。
大伙可能立马想到的是加synchronized同步方法,是了只要把getInstance()变成同步(synchronized)方法,多线程灾难就可以轻而易举的解决了(代码如下):
public class Singleton {
private static Singleton uniqueInstance;
private Singleton() {}
public static synchronized Singleton getSingleton() {
if (uniqueInstance== null) {
uniqueInstance = new Singleton();
}
return uniqueInstance ;
}
//其它有用的方法
}
看到这块儿,可能有的同学会说了,同步getInstance()的做法交拖垮性能,该怎么办呢?
1.如果getInstance()的性能对应用程序不是很关键,就什么都别做
2.使用“急切”创建实例,而不用延迟实例化的做法
public class Singleton {
private static Singleton uniquerInstance = new Singleton();
private Singleton(){}
public static Singleton getInstance() {
return uniqueInstance;
}
}
利用这个做法,我们依赖JVM在加载这个类时,马上创建此唯一的实例。JVM保证在任何线程访问uniqueInstance静态变量之前,一定先创建此实例。
3.用”双重检查加锁“,在getInstance()中减少使用同步
利用双重检查加锁(double-checked locking),首先检查是否实例已经创建了,如果尚未创建,“才”进行同步。
public class Singleton {
private volatile static Singleton uniquerInstance = new Singleton();
private Singleton(){}
public static Singleton getInstance() {
if (uniqueInstance == null) {
synchronized (Singleton.class) {
if (uniqueInstance == null) {
uniquerInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}
如果性能是你关心的重点,那么这个做法可以帮你大大地减少getInstance()的时间耗费。
注意:
双重检查加锁不适用于1.4及更早版本的Java!
在1.4及更早版本的java中,许多JVM对于volatile关键字的实现会导致双重检查加锁的失效。如果你不能用Java5,而必须使用旧版的Java,就请不要利用此技艺实现单例模式。
相关推荐
Java设计模式之单例模式的七种写法 单例模式是一种常见的设计模式,它确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机的驱动程序对象常...
python 设计模式之单例模式
设计模式之单例模式详解 单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。 单例模式的实现主要是...
通过研磨设计模式之单例模式的资料,你可以深入理解单例模式的原理、实现方式及其优缺点,进一步提升自己的编程技能和设计思维。学习并熟练掌握设计模式,对于成为一名优秀的Java开发者至关重要。
Java设计模式之单例模式详解 一、单例模式概览 单例模式(Singleton Pattern)是面向对象设计模式中的一种,属于创建型模式。它确保一个类仅有一个实例,并提供一个全局访问点来访问该实例。单例模式的核心在于控制...
单例模式是软件设计模式中的一种经典模式,它保证了类只有一个实例存在,并提供一个全局访问点。在Java等面向对象编程语言中,单例模式常用于管理共享资源,如数据库连接池、线程池或者配置文件等。结合工厂模式,...
### PHP设计模式之单例模式详解 #### 一、引言 在软件工程领域,设计模式是一种被广泛接受的解决方案,用于解决特定类型的问题。PHP作为一种流行的服务器端脚本语言,同样可以从这些设计模式中受益。本文将详细介绍...
JAVA设计模式之单例模式(完整版)1[定义].pdf
单例模式是一种常用的设计模式,它的核心思想是在整个应用程序中,一个类只能有一个实例存在。单例模式常用于控制资源的共享,例如数据库连接池、日志服务等。单例模式有多种实现方式,常见的包括懒汉式、饿汉式以及...
细心整合和单例模式和工厂模式的几种模型,懒汉式,饿汉式,如何并发操作模式,等都有详细讲解
设计模式之单例模式,单列模式的几种实现形式,以及其优缺点,还有就是示例,对初步了解单列模式的有所帮助
单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在。 许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。 比如在某个服务器程序中,该服务器的配置信息存放...
本次我们将深入探讨两种设计模式——单例模式和装饰模式,它们在Java编程中都有着广泛的应用。 首先,让我们来理解“单例模式”。单例模式是一种创建型设计模式,其核心思想是保证一个类只有一个实例,并提供一个...
目录 单例模式的概念 单例模式的要点 单例模式类图 单例模式归类 单例模式的应用场景 单例模式解决的问题 单例模式的实现方式 单例模式实现方式对比 单例模式的概念 单例模式,顾名思义就是只有一个实例,并且由它...