单例模式:确保一个类只有一个实例,并提供一个全局访问点。单例可以延迟实例化(lazy instantiate)。
// 经典的单件模式实现
public class Singleton {
/* 利用一个静态变量来记录Singleton类的唯一实例 */
private static Singleton uniqueInstance;
// 这里是其他的有用实例化变量
private Singleton() {
/* 把构造器声明为私有的,只有在Singleton类内才可以调用它*/
}
/* 用getInstance()方法实例化对象,并返回这个实例 */
public static Singleton getInstance() {
if (uniqueInstance == null) {
/* 如果我们不需要这个实例,它就永远不会产生,这就是延迟实例化*/
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
// 这里是其他有用的方法
}
有些对象我们只需要一个,例如线程池、缓存、处理偏好设置和注册表的对象、日志对象、充当打印机、显卡等设备的驱动程序的对象。而单例模式给我们了一个全局的访问点,和全局变量一样方便,又没有全局变量的缺点,如果将对象赋值给一个全局变量,那么你必须在程序一开始就创建好对象,如果这个对象非常耗资源,而程序在这次的执行过程中又一直没有用它,这就形成了浪费。
单例模式中的多线程问题:两个线程有可能会创建两个实例,那么该如何处理这种情况呢:
A.只要把getInstance()变成同步(synchronized)方法(会降低性能,其实只有第一次执行此方法时,才需要同步,如果getInstance()的性能对应用程序不是很关键,就用这种方法)
public class Singleton {
private static Singleton uniqueInstance;
// 其他有用的实例化的变量
Private Singleton() {}
Public static synchronized Singleton getInstance() {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
// 其他有用的方法
}
B. 使用“急切”创建实例(饥渴式),而不用延迟实例化(懒汉式)的做法
public class Singleton {
/* 在静态初始化器(static initializen)中创建单件 这保证了线程安全(thread safe)*/
private static final Singleton uniqueInstance = new Singleton();
public static Singleton getInstance() {
return uniqueInstance; // 直接返回实例
}
}
C.用“双重检查加锁”(double-checked locking,首先检查实例是否已经创建了,如果尚未创建,才进行同步),在个getInstance()中减少使用同步:
public class Singleton {
/* volatile关键字确保:当uniqueInstance变量被初始化成Singleton实例时,多个线程正确地处理uniqueInstance变量 */
private volatile static Singleton uniqueInstance;
private Singleton() {}
public static Singleton getInstance() {
if (uniqueInstance == null) { // 检查实例,如果不存在,就进入同步区块
synchronized (Singleton.class) {//只有第一次才彻底执行这里的代码
if (uniqueInstance == null) {//进入区块后,再检查一次
uniqueInstance = new Singleton();
}//Singleton.class是该类对应的字节码文件对象。
}
}
return uniqueInstance;
}
如果使用 多个类加载器,可能导致单例失效而产生多个实例。
分享到:
相关推荐
单例模式(Singleton Pattern)是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。这种模式常用于需要全局共享资源的场景,比如配置管理、日志记录等。 单例模式的组成 私有构造函数:防止外部...
单例模式是软件设计模式中的一种,属于创建型模式,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下都非常有用,例如管理共享资源、配置对象或者缓存服务等。 单例模式的核心...
**单例模式(Singleton Pattern)**是软件设计模式中的一种基础模式,它的核心思想是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下非常有用,比如配置管理、线程池、数据库连接池等,这些都...
单例模式(Singleton Pattern)是一种常用的软件设计模式,在系统中确保某个类只有一个实例,并提供一个全局访问点。这种模式通常用于控制资源的消耗,比如数据库连接、线程池等,以及确保某个系统配置的一致性。 #...
单例模式是一种常见的设计模式,属于创建型模式之一。这种模式的核心在于确保某个类只有一个实例存在,并且提供一个全局访问点来获取该实例。单例模式在Java开发中尤其常见,因为它能够帮助开发者控制对象的创建过程...
内容概要:本文档介绍了三个经典的软件设计模式——单例模式(Singleton Pattern)、工厂模式(Factory Pattern)以及观察者模式(Observer Pattern)的具体实现,并给出了带有详细注释的C++代码范例。对每个设计模式都有...
单例模式(Singleton Pattern)是面向对象设计模式中的一种,属于创建型模式。它确保一个类仅有一个实例,并提供一个全局访问点来访问该实例。单例模式的核心在于控制类的实例化过程,保证在任何情况下都只会创建一...
单例模式(Singleton Pattern)是设计模式中最简单的模式之一,属于创建型模式。这种设计模式主要是类的对象只有一个实例,不需要每次new 创造。而我们要做的的就是确保这个对象创建的唯一。然后根据一些特征进行...
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一,有以下特点: 1. 单例类只能有一个实例。 2. 单例类必须自己创建自己的唯一实例。 3. 单例类必须给所有其他对象提供这一实例。 单例模式有多种实现...
单例模式(Singleton Pattern)是软件设计模式中的一个重要组成部分,属于创建型模式之一。它保证一个类仅有一个实例,并提供一个全局访问点。单例模式的核心在于确保某个类只有一个实例存在,并且这个实例能够被...
单例模式(Singleton Pattern 单件模式或单元素模式),是常见的一种设计模式,它有三个特点 1.只能有一个实例 2.必须自行创建这个实例 3.必须给其他对象提供这一实例 下面用PHP代码实现一下 <?PHP /** *...
单例模式(Singleton Pattern)是一种常用的软件设计模式,它的核心意图是确保一个类在整个系统中只有一个实例,并提供一个全局访问点。这样的设计可以避免资源浪费,尤其在处理那些需要共享状态且频繁使用的对象时...
总结来说,单例模式是一种常见的设计模式,用于控制类的实例化过程,保证在整个系统中只有一个实例存在。在Java中,我们可以使用多种方式来实现单例,包括传统的同步方法、双重检查锁定和枚举。然而,使用单例模式时...
单例就是单个对象的意思,指在系统运行期间,一个类最多只能创建一个对象,且该类能自行创建这个对象的一种编码设计模式。 单例模式有两个特点: 在系统的整个生命周期内,单例对象最多只能有一个 单例对象必须由...
单例模式(Singleton Pattern)是一种常用的软件设计模式,它保证一个类仅有一个实例,并提供一个访问该实例的全局访问点。这种模式通常用于需要频繁地创建和销毁的对象,以减少系统性能开销。 单例模式的优点: ...
C#单例模式(Singleton Pattern)是一种常用的设计模式,用于确保一个类只有一个实例,并提供一个全局访问点。下面我们将详细介绍C#单例模式的定义、实现和优化。 单例模式的定义: 单例模式的主要目的是确保一个...
设计模式中的装饰器模式(Decorator Pattern)与单例模式不同,它是一种结构型模式,用于在运行时动态地给对象添加新的行为。装饰器模式通过将对象包装在一个装饰类中来扩展其功能,而不是通过继承来实现。这种模式...
单例模式(Singleton Pattern)是一种常用的软件设计模式,它的核心思想是确保一个类在整个应用程序中只有一个实例存在,并提供一个全局访问点来获取这个实例。这种模式在很多场景下非常有用,比如管理系统资源、...
备忘录模式(Memento Pattern) 策略模式(Strategy Pattern) 抽象工厂模式(Abstract Factory Pattern) 代理模式(Proxy Pattern) 单例模式(Singleton Pattern) 迭代器模式(Iterator Pattern) 访问者模式(Visitor ...
单例模式(Singleton Pattern)作为创建型模式中的一种,旨在确保一个类在系统中只有一个实例,并提供全局访问点。