单例模式应用于一个类只有一个实例的情况,并且为其实例提供一个全局的访问点。
特点:
1.一个类只有一个实例
2.自己创建这个实例
3.整个系统只能用这个实例
应用场景
外部资源:每台计算机有若干个打印机,但只能有一个PrinterSpooler,以避免两个打印作业同时输出到打印机。
内部资源:大多数软件都有一个(或多个)属性文件存放系统配置,这样的系统应该有一个对象管理这些属性文件。
实现方式
1.饿汉式:单例实例在类装载时就构建,急切初始化。(预先加载法)
/** * 饿汉式(推荐) * */ public class Singleton1 { private Singleton1() { } public static Singleton1 instance = new Singleton1(); public Singleton1 getInstance() { return instance; } }
优点 | 1.线程安全 2.在类加载的同时已经创建好一个静态对象,调用时反应速度快 |
缺点 | 资源效率不高,可能getInstance()永远不会执行到,但执行该类的其他静态方法或者加载了该类(class.forName),那么这个实例仍然初始化 |
2.懒汉式:单例实例在第一次被使用时构建,延迟初始化。
class Singleton2 { private Singleton2() { } public static Singleton2 instance = null; public static Singleton2 getInstance() { if (instance == null) {
//多个线程判断instance都为null时,在执行new操作时多线程会出现重复情况 instance = new Singleton2(); } return instance; } }
懒汉式在单个线程中没有问题,但在多线程就可能会出现两个或多个Singleton2实例情况,
虽然后面实例化的Singleton2会覆盖前面实例化的Singleton2,但最好避免这样的情况。
改进方式就是加锁synchornized
class Singleton3 { private Singleton3() { } public static Singleton3 instance = null; public static synchronized Singleton3 getInstance() { if (instance == null) { instance = new Singleton3(); } return instance; } }
优点 | 资源利用率高,不执行getInstance()就不会被实例,可以执行该类的其他静态方法 |
缺点 | 第一次加载时不够快,多线程使用不必要的同步开销大 |
3.双重检测
class Singleton4 { private Singleton4() { } public static Singleton4 instance = null; public static Singleton4 getInstance() { if (instance == null) { synchronized (Singleton4.class) { if (instance == null) { instance = new Singleton4(); } } } return instance; } }
优点 | 资源利用率高,不执行getInstance()就不被实例,可以执行该类其他静态方法 |
缺点 | 第一次加载时反应不快,由于java内存模型一些原因偶尔失败 |
4.静态内部类
class Singleton5 { private Singleton5() { } private static class SingletonHelp { static Singleton5 instance = new Singleton5(); } public static Singleton5 getInstance() { return SingletonHelp.instance; } }
优点 | 资源利用率高,不执行getInstance()不被实例,可以执行该类其他静态方法 |
缺点 | 第一次加载时反应不够快 |
总结:一般采用饿汉式(1),若对资源十分在意可以采用静态内部类(4),不建议采用懒汉式及双重检测(2、3)
另外
对于第二种可以采用volatile方式
volatile用更低的代价代替同步
解释:同步的代价主要有覆盖范围决定,如果可以降低同步的覆盖范围,可大幅提升性能。
而volatile覆盖范围是变量级别的,因此同步代价很低。
volatile原理:告诉处理器,不要将其放入工作内存,而是直接在主存操作。因此,当多处理器或多线程在访问该变量时
都将直接操作主存,这在本质上做到了变量共享。
volation优势:
1.更大的程度吞吐量
2.更少的代码实现多线程
3.程序伸缩性好
4.比较好理解,无需太高的学习成本
volatile不足:
1.容易出问题
2.比较难设计
参考文献
http://yiminghe.iteye.com/blog/404334
http://developer.51cto.com/art/201103/249322.htm
本文转自:http://www.blogjava.net/wangchenyang/archive/2011/09/05/363081.html
相关推荐
1. **线程安全**:在高并发环境下,必须注意单例模式的线程同步问题,避免多个线程同时创建实例导致的不一致性。 2. **对象复制问题**:需要防止通过序列化或反射机制创建额外的实例,这可能破坏单例模式的一致性。 ...
总结起来,Java中的单例模式有多种实现,每种都有其优缺点。开发者应根据项目需求选择适合的实现方式,比如对性能要求较高的场景可以选择静态内部类或枚举,而对内存占用敏感的场景则可能更适合饿汉式。通过学习和...
单例模式的缺点: 1. **系统开销**:虽然单例模式可以减少不必要的对象创建,但在某些情况下,过度依赖单例可能会增加系统的复杂性和内存占用,尤其是在大型项目中。 2. **开发混淆**:由于隐藏了实例化的细节,...
然而,单例模式也有一些缺点: - 打破了单一职责原则,因为单例类不仅要处理业务逻辑,还要管理自己的实例化。 - 单例模式难以进行单元测试,因为它没有公共的构造函数,使得模拟对象变得困难。 - 难以解耦,单例...
单例模式是设计模式中的一种,它在Java编程中被广泛应用,主要目的是限制类的实例化,确保在程序运行期间,对于某个特定类,只存在一个全局共享的对象。这种模式通常用于那些需要频繁实例化然后销毁,或者创建代价...
在Java中,实现单例模式有多种方法,每种都有其特定的优缺点和适用场景。以下是几种常见的单例模式实现方式: 1. **饿汉式(静态常量)**: 这是最简单的实现方式,它在类加载时就完成了初始化,因此是线程安全的...
单例模式是软件设计模式中的一种经典模式,其主要...总结起来,单例模式有多种实现方式,每种方式都有其适用场景和优缺点。在实际应用中,开发者应根据项目需求选择合适的单例实现,并注意线程安全和反序列化等问题。
单例模式是软件设计模式中的一种,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下都非常有用,比如控制资源的唯一性、管理共享配置或者创建昂贵的对象时避免频繁创建销毁。 ...
以上就是单例模式的常见实现方式,每种都有其适用场景和优缺点。在实际开发中,应根据项目需求和环境选择合适的单例模式实现。在设计模式中,单例模式不仅限于上述实现,还可以与其他模式结合使用,如工厂模式、装饰...
在C++中,实现单例模式有多种方法,我们将会深入探讨这一模式的原理、优缺点以及如何在实际编程中应用。 单例模式的核心在于控制类的实例化过程,防止多处代码创建多个实例导致资源的浪费或者状态不一致的问题。在...
#### 三、单例模式的创建方式及优缺点 单例模式的实现方式主要有三种:饿汉式、懒汉式以及静态内部类方式。 - **饿汉式** - **实现**: ```java public class Single1 { // 创建一个静态的实例 private ...
4. **单例模式的缺点**: - 反对依赖注入:由于单例模式控制了实例化过程,使得外部难以替换或模拟这个类的实例,不利于单元测试和解耦。 - 延迟加载:单例模式往往在第一次调用`getInstance()`时就创建了实例,...
懒汉式单例是在使用时才创建实例的单例模式。这种方式的优点是避免了无用的创建过程,但缺点是需要加锁以保证线程安全。 ```java public class Singleton { // 私有的默认构造子 private Singleton() {} // 已经...
### 三、单例模式的应用场景与优缺点 **应用场景**: - 全局日志对象 - 数据库连接池 - 缓存服务 - 线程池 - 多线程环境下的线程同步控制 **优点**: - 节省内存空间,减少系统资源消耗。 - 避免对资源的多重占用...
【单例模式】是一种常用的软件设计模式,其主要目的是确保一个类只有一个实例,并提供一个全局访问点。在软件开发中,单例模式常用于管理共享资源或者需要协调多个组件交互的场景,比如数据库连接池、日志服务等。 ...
#### 四、单例模式的优缺点 ##### 优点 - **减少内存开销**:避免了多次创建不必要的对象实例,节省了内存空间。 - **方便全局访问**:通过单例模式可以方便地获取对象实例,无需重复创建。 - **便于扩展**:由于...
### OC单例模式讲解 #### 一、单例模式简介 单例模式是设计模式中的一种,属于创建型...通过本文的介绍,我们了解了单例模式的概念、实现方法以及其优缺点。希望这些内容能够帮助开发者更好地理解和应用单例模式。
两种实现方式都可以实现单例模式,但是它们有不同的优缺点。 单例模式是一种常用的设计模式,用于确保系统中只有一个实例存在,并提供了一个全局访问点来访问该实例。它可以应用于各种系统,如服务器负载均衡器、...
下面我们将深入探讨单例模式的实现方式、优缺点以及在实际开发中的应用。 首先,单例模式的三个核心特性如描述中所提到: 1. **唯一实例**:在程序运行期间,单例类只能被实例化一次。这通常通过将构造函数设为私有...