1. Singleton模式介绍:
Singleton模式也成为单件模式,即确保一个类只有一个实例,并提供一个全局的访问点.
类图:
Singleton
Static instance
//其他有用的单件数据
Static getInstance()
//其他有用的单件方法
2. Singleton模式的实现:
public class SingletonMethod {
private static SingletonMethod instance = null;
private SingletonMethod(){
}
public static SingletonMethod getInstance() {
if (null == instance) {
instance = new SingletonMethod2();
}
return instance;
}
/**
* @param args
*/
public static void main(String[] args) {
SingletonMethod test1= SingletonMethod.getInstance();
SingletonMethod test2= SingletonMethod.getInstance();;
System.out.println(test1.equals(test2));
System.out.println(test1.hashCode()==test2.hashCode());
}
}
实现的说明;构造器是私有的,保证不能被外部类所直接创建.在通过getInstance()来调用时,判断实例是否已经创建,如果没有创建再进行创建.通过测试我们验证了创建2次出的实例确实时一个.真的很简单.那我们还是来看看下面的注意事项吧!
3. Singleton模式的注意事项
上面的实现好像很好,不过上面的做法却不能保障我们每次取到的实例就是一个,那么是什么时候呢?让我们来看看.当我们程序中使用了多线程的时候,确实有创建了两个不同实例的时候,究竟是为什么呢?研究发现,其实有时候会有两个线程同时去访问getInstance(),发现instance为null,那么他们都会去创建这个实例并返回,这样就会产生两个实例了.哈哈,问题找到了,我们要怎么来修改呢?
首先我们想到的是,多线程并发时我们可以使用synchronized的,我们这样来修改一下:
public static synchronized SingletonMethod2 getInstance() {
if (null == instance) {
instance = new SingletonMethod2();
}
return instance;
}
问题得到解决了,可以仔细考虑时我们发现,还有一个比较严重的问题,只有第一次执行此方法才需要同步,那么我们每次都来同步它,一定会降低效率的.如果您能接收这样的处理负担,那么这样的方法还是很好的,简单有效.
那么有办法改善多线程嘛?参见以下处理方法:
1. 使用”急切”创建实例,二不用延迟实例化的做法
public class SingletonTest {
private SingletonTest() {
}
private static SingletonTest instance = new SingletonTest();
public static SingletonTest getInstance() {
return instance;
}
public static void main(String[] args) {
SingletonTest test1= SingletonTest.getInstance();
SingletonTest test2= SingletonTest.getInstance();;
System.out.println(test1.equals(test2));
System.out.println(test1.hashCode()==test2.hashCode());
}
}
2. 使用”双重加锁”的办法
private volatile static SingletonMethod2 instance = null;
public static SingletonMethod2 getInstance() {
if (null == instance) {
synchronized (SingletonMethod2.class) {
if (null == instance) {
instance = new SingletonMethod2();
}
}
}
return instance;
}
Volatile 关键字确保,当instance变量被初始化为singleton实例时,多个线程能正确地处理instance变量.
注:双重加锁不适用于1.4及更早的JDK.
总结一些吧:其实大多数人都了解singleton模式,在使用的过程中也都用过,不过你们注意了这些可能的问题了嘛?
分享到:
相关推荐
在C++中,最简单也是最常见的Singleton模式实现方式如下所示: ```cpp class Singleton { public: static Singleton* Instance() { if (_instance == nullptr) { _instance = new Singleton; } return _...
Java设计模式是面向对象编程中的重要概念,它们是解决常见问题的经验总结,为代码的可重用性、可维护性和可扩展性提供了指导。这里我们将深入探讨三种常见的Java设计模式:单例(Singleton)、工厂方法(Factory ...
下面我们将详细介绍Singleton模式的几种常见实现方式: 1. 饿汉式(静态常量): 在类加载时就完成了初始化,因此这种方法是线程安全的。但是,由于类加载较早,即使尚未使用Singleton,也会创建实例,造成内存...
### Java的Singleton模式详解 #### 一、Singleton模式概述 Singleton模式是一种常用的设计模式,在Java中主要用于确保一个类只有一个实例,并提供一个全局访问点。这种模式对于管理共享资源(如数据库连接池、...
很多时候我们都会需要Singleton模式,最常见的比如我们希望整个应用程序中只有一个连接数据库的Connection实例;又比如要求一个应用程序中只存在某个用户数据结构的唯一实例。我们都可以通过应用Singleton模式达到...
描述中提到的“多线程的实现”意味着Singleton模式需要考虑线程安全问题。在多线程环境中,如果没有正确的同步机制,可能会出现多个线程同时创建Singleton实例的情况。解决这个问题的方法有几种: 1. 静态初始化:...
在Java编程中,Singleton模式是一种常用的设计模式,它确保一个类只有一个实例,并提供一个全局访问点。...正确实现Singleton模式,可以提高程序的稳定性和可维护性,避免多线程环境下的资源竞争和实例重复创建问题。
【深入浅出单例Singleton模式】 单例模式是一种在软件设计中常见的设计模式,它的核心目标是确保一个类只有一个实例,并提供一个全局访问点。在Java等面向对象编程语言中,单例模式常用于控制资源的共享,如全局...
在C#编程中,面向对象设计模式是一种组织代码和解决常见设计问题的模板。Singleton模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取这个唯一的实例。这种模式在需要控制资源的唯一...
在Android中,Singleton模式的应用场景包括但不限于: 1. 应用程序配置管理:例如,一个AppConfig类用于存储和管理应用的全局配置信息。 2. 数据库连接管理:在多线程环境下,共享数据库连接池以提高性能和减少资源...
- `singleton.cpp`包含了单例类的实现,可能包括了上述的某一种或多种单例模式的实现。 - `main.cpp`是程序的入口,可能会在其中调用单例对象进行测试。 - `mainwindow.cpp`和`mainwindow.h`可能是UI界面的实现和...
在软件工程中,设计模式是解决常见问题的模板,它们代表了经过时间考验的最佳实践。Singleton模式是一种创建型设计模式,它保证一个类只有一个实例,并提供一个全局访问点来获取这个实例。这种模式在系统中需要一个...
单例模式的核心在于控制类的实例化过程,防止多处代码创建多个实例导致资源的浪费或者状态不一致的问题。在C++中,通常通过以下步骤来实现: 1. **私有化构造函数**:为了确保外部不能直接通过new关键字实例化单例...
在Java中,单例模式的实现方式多种多样,但常见的有饿汉式(Eager Initialization)和懒汉式(Lazy Initialization)两种。 1. **饿汉式**: 饿汉式是在类加载时就完成了初始化,所以类加载比较慢,但获取对象的...
本篇文章将深入探讨C#中的Singleton模式,包括其原理、实现方式以及适用场景。 首先,Singleton模式的核心思想是限制类的实例化过程,只允许类的内部创建一个实例,并通过静态方法或属性暴露给外部。这样做的好处...
### 单例模式 Singleton Pattern #### 概述 单例模式是一种常见的设计模式,属于创建型模式之一。这种模式的核心在于确保某个类只有一个实例存在,并且提供一个全局访问点来获取该实例。单例模式在Java开发中尤其...
设计模式是解决常见软件设计问题的模板,Singleton 模式是其中最基础、最常用的一种。通过深入理解并恰当运用 Singleton,我们可以提高代码的可维护性和可复用性。在实际开发中,要根据项目需求和场景选择合适的 ...
总的来说,Singleton模式在C++中是一种常见且重要的设计模式,它通过控制类的实例化数量,提供了全局访问点,有助于管理资源和协调系统组件。然而,使用时也需谨慎,以免引入不必要的复杂性和耦合。
单件模式(Singleton pattern)是设计模式中的一种结构型模式,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式常用于系统中需要频繁创建和销毁的对象,如日志服务、线程池或者数据库连接等...