一、什么情况下考虑使用“单例模式”?
单例模式使得一个类在任何情况下只有一个对象,通常当需要一个类来管理共享的资源(例如:线程池、注册表,缓存等)可以使用单例模式,因为我们需要保证这些全局资源只有一份。
单例模式的概念:
单例模式确保一个类只能有一个实例,而且为这个实例提供了一个全局访问点。
二、如何实现单例模式?
①将构造方法私有化
②通过一个private静态变量记录单例类的唯一实例。
③定义一个获取该实例静态方法。 实现如下:
public class Singleton { private static Singleton singleton; private Singleton(){} //构造方法私有化 public static Singleton getInstance(){ if(singleton == null) singleton = new Singleton(); return singleton; }
以上便实现了简单的单例模式,但是在多线程时可能会出现错误,所以需要对程序进行简单的修改如下:
对getInstance()方法添加同步锁:
public static synchronized Singleton getInstance() { if (singleton == null) singleton = new Singleton(); return singleton; }
这样可以保证在其他线程进入getInstance()方法时需等待其他方法执行完getInstance()方法。
然而如果程序访问getInstance()方法的频率很高,这就会产生效率问题,我们可以采用单例中的饿汉模式,代码如下:
public class Singleton { private static Singleton singleton = new Singleton(); private Singleton() { } //构造方法私有化 public static Singleton getInstance() { return singleton; } }
这样就可以使得JVM在加载这个类时就创建这个类的唯一实例,那么即使在多线程中也不会出现问题。
然而如果程序中我们可能很多情况下不要调用这个类的话,加载马上就创建实例,又会造成很大的浪费,我们该怎么办呢?
可以使用“双重检查加锁”,在getInstance()中减少使用同步,只有在创建实例时添加同步锁,代码如下:
public class Singleton { private volatile static Singleton uniqueInstance; private Singleton() { } //构造方法私有化 public static Singleton getInstance() { if(uniqueInstance == null){ synchronized (Singleton.class){ if(uniqueInstance == null) uniqueInstance = new Singleton(); } } return uniqueInstance; } }
注意:uniqueInstance使用了volatile关键词修饰,volatile使得线程对缓存中数据的修改强制的写入主存,同时使得cpu中其他的线程缓存无效,需要从主存中重新读取(对多线程我也不太了解,以后慢慢学习吧)。
需要注意的是“双重检查加锁”不适用java 1.4及其以前版本。
在维基百科中也找到了关于延迟加载同时又避免加锁的另一个版本:
In software engineering, the Initialization on Demand Holder (design pattern) idiom is a lazy-loaded singleton. In all versions of Java, the idiom enables a safe, highly concurrent lazy initialization with good performance.
public class Singleton { private static class LazyHolder{ private static final Singleton uniqueInstance = new Singleton(); } private Singleton() { } //构造方法私有化 public static Singleton getInstance() { return LazyHolder.uniqueInstance; } }
相关推荐
**设计模式——单例模式** 在软件工程中,设计模式是一种在特定场景下解决常见问题的标准方案,可以被复用并提升代码质量。单例模式是设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。这种模式...
单例模式是软件设计模式中的一种经典模式,它保证了类在任何情况下都只有一个实例存在。这个模式在很多场景下非常有用,例如控制全局资源、管理配置信息等。本文将详细探讨单例模式的懒汉式实现,并结合源码进行解析...
单例模式是软件设计模式中的一种经典模式,其主要目的是控制类的实例化过程,确保在任何情况下,一个类只有一个实例存在。这种模式通常用于管理共享资源或者全局配置,例如数据库连接池、线程池、日志服务等。在Java...
### Java设计模式——单例模式详解 #### 一、单例模式概述 单例模式是设计模式中的一个重要组成部分,属于创建型模式之一。其主要作用是确保某个类仅有一个实例存在,并提供一个全局访问该实例的方法。这在很多场景...
单例模式是软件设计模式中的一种,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下都非常有用,比如控制共享资源、管理系统级别的服务或者简化对象间的交互。单例模式的核心在于...
**设计模式——单例模式** 单例模式是一种广泛应用于软件设计中的创建型设计模式,它的核心思想是确保一个类只有一个实例,并提供一个全局访问点。这样做的好处在于控制共享资源的访问,比如线程安全的数据库连接池...
本次我们将深入探讨两种设计模式——单例模式和装饰模式,它们在Java编程中都有着广泛的应用。 首先,让我们来理解“单例模式”。单例模式是一种创建型设计模式,其核心思想是保证一个类只有一个实例,并提供一个...
**Java设计模式——单例模式推理过程** 设计模式是软件开发中的一种最佳实践,它封装了前辈们在解决常见问题时积累的经验。这些模式被广泛使用、被大家所熟知,并且已经进行了系统的分类。设计模式的目标是提高代码...
《Java与模式——源码》这个主题涉及到的是Java编程语言中的设计模式应用,以及如何通过源代码来理解和学习这些模式。设计模式是软件工程中的一种最佳实践,它们是解决常见问题的经验总结,使得代码更易读、易维护、...
在编程世界中,Java设计模式是面向对象编程领域的一个重要概念,它为解决常见的软件设计问题提供了可重用的解决方案。对于新手来说,设计模式可能显得深奥难懂,但它们实际上是经验丰富的开发者用来提高代码质量、可...
本资料“《java设计模式》课后习题模拟试题解答——刘伟.zip”主要涵盖了Java设计模式的学习与应用,特别是针对刘伟教授的相关课程的课后习题及模拟试题的解答。 设计模式分为三大类:创建型、结构型和行为型模式。...
《设计模式——Java语言中的应用》是一本专为Java开发者深入理解面向对象设计而编写的经典书籍。设计模式是软件工程领域中经过实践验证的、解决常见问题的有效方案,它们代表了在特定上下文中,针对特定问题的最优...
### Java设计模式——单例模式详解 #### 一、单例模式的概念与意义 单例模式(Singleton Pattern)是Java中最常用的设计模式之一,它的核心在于确保某个类仅有一个实例,并提供一个全局可访问的点。这对于那些需要...
在Java中,实现单例模式主要有三种方式:饿汉式、懒汉式和双重检查锁定(DCL)。 1. 饿汉式: 饿汉式是在类加载时就完成了初始化,因此类加载比较慢,但获取实例的速度快,且线程安全。代码如下: ```java public...
在本文中,我们将深入探讨三种工厂设计模式——简单工厂模式、抽象工厂模式和工厂方法模式,以及两种单例模式——饿汉单例模式和懒汉单例模式。这些模式都是面向对象设计中的重要组成部分,对于理解和构建可维护、可...
### Java设计模式经典教程知识点概览 #### 一、设计模式概述 设计模式是一种软件设计方法,它为软件开发者提供了一种标准化的方式去解决常见的软件设计问题。设计模式的使用可以提高代码的可读性和可维护性,同时...