说到单例模式可能大家都不陌生,都会用,但是如何才能写出一个健壮的单例模式,并扩展成适合项目的单例模式其实也是需要仔细思考的问题.通常我们实现单例的方式有几种,在初始化的时候创建对象,另一种方式则是通过方法判断是否为空,并创建对象返回。貌似看上去没什么太大差距,但事实上通过初始化时创建对象是线程安全的,通过方法获得对象是需要考虑相称安全的。
说到这里,不得不说一下关于线程的问题,其实在最早的单核CPU时代,我们是不需要考虑创建对象的线程安全的,毕竟CPU在同一时间点只能做一件事情,但是在这个拥有双核,四核的时代,我们不得不考虑这个问题.所以说我们不得不在判断以及创建对象的时候对其进行同步,但是仅仅在此同步就OK了嘛,当然不是。因为就其本身也会存在同步的问题,用一个例子来说明这一点,假如我们现在有1台32位的双核PC,当其处理64位Long型数据时,其实是会将其分为高32位,与第32位两部分来处理的,如果在非线程安全的情况下,则有几率导致一些脏数据.也因此出现了volatile来保证其原子性,并在JDK1.5以后出现了concurrent的基本类型.(-.-废话多了点儿)
所以,如果不想在一开始就创建对象占用空间的话,那么最好采用懒加载的方式,在初始化的时候将对象设置为静态私有成员变量,并保持其原子性,并在调用方法判断并创建对象时对其进行同步,以保证创建出唯一的对象.到此,我们才能真正保证其唯一性。
但是,往往我们的使用场景不是仅此而已,我们还会遇到序列化与反序列化的问题,我们还需要保证其序列化与反序列化是同一对象,所以我们必须对readSolve方法。
这样我们基本就能创建出一个健壮的单例对象了。
现在我们虽然能创建健壮的单例对象了,但是又有新的问题值得我们去思考了,什么时候我们应该使用单例?
这还用说么,什么Connection,Factory等等,都是我们使用的场景.但是你觉得这真的就合适吗?就我个人而言,我觉得一个对象是否应该是单例通常都是由我们的使用场景所决定的,所以说像这样硬编码一开始就决定对象是单例,往往是不太科学的,其应该由容器所决定,是可配置的,这样才能更加灵活。
从而也衍生出了变种的多例,及线程池,连接池等等.
分享到:
相关推荐
- 在多线程环境下需要考虑线程安全问题。 #### 七、总结 单例模式是设计模式中较为基础且实用的一种模式,在OC开发中有着广泛的应用。通过本文的介绍,我们了解了单例模式的概念、实现方法以及其优缺点。希望这些...
Java 单例模式线程安全问题详解 Java 单例模式线程安全问题是指在 Java 中实现单例模式时,如何确保线程安全的问题。单例模式是指在整个应用程序生命周期中,只有一个实例存在的设计模式。这种模式可以提高性能,...
### Android中的单例模式详解 #### 一、概念与特性 单例模式是软件工程中常用的设计模式之一,尤其在Java编程中非常...对于涉及到多线程操作的场景,建议优先考虑使用饿汉式单例或带有线程安全保护的懒汉式单例实现。
在实现级联下拉时,我们需要考虑数据的异步加载和缓存,以及用户交互时的响应速度。单例模式恰好可以帮助我们实现这一目标,因为单例的数据管理类可以缓存已加载的省级和市级数据,减少不必要的网络请求。 在具体...
考虑到并发访问时数据同步的问题,通常会采用单例模式实现计数器逻辑。这种方式能够确保即使在高并发环境下,也能准确地记录每一次访问。 **4. 应用程序的日志处理** 在开发和运维阶段,日志记录对于追踪错误和...
然而,单例模式也有一些缺点: - 打破了单一职责原则,因为单例类不仅要处理业务逻辑,还要管理自己的实例化。 - 单例模式难以进行单元测试,因为它没有公共的构造函数,使得模拟对象变得困难。 - 难以解耦,单例...
在Java中,实现单例模式有多种方式,但最常见的问题是线程安全问题。例如,上述代码展示了一个简单的单例实现,称为"饿汉式"单例,因为无论是否需要,它都会在类加载时立即创建实例。这种方式虽然简单,但在多线程...
尽管单例模式简单有效,但它也存在一些潜在问题,特别是在 Java 的环境中。这些问题包括: - **多线程环境下实例的创建**:在多线程环境下,如果没有正确地处理同步,可能会导致多个线程同时创建实例,从而破坏单例...
单例模式是软件设计模式中的一种,它的主要...在实际应用中,还需要考虑JVM的垃圾回收机制、序列化以及测试等方面的问题,以确保单例模式的正确性和健壮性。理解并熟练运用单例模式,有助于提高代码的可维护性和效率。
这时需要考虑如何优雅地处理单例对象的生命周期管理问题。 #### 五、案例分析 以《星际争霸》中的刀锋女王凯瑞甘(Kerrigan)为例,她对虫族(Zerg)而言是至关重要的灵魂人物,必须确保在整个游戏中只有一个实例...
然而,单例模式也存在一些潜在问题: 1. **过度使用**:过度依赖单例可能导致代码紧密耦合,不利于测试和扩展。 2. **线程安全**:虽然上述代码考虑了线程安全,但在特定情况下,仍可能存在竞态条件,需要额外的...
实现单例模式:1、私有化的构造函数。2、提供静态方法或者公共属性提供全局访问点。3、考虑多线程高并发的问题。 注意点:lock之前判断一下实例是否为空。lock之前判断一下什么情况可以lock什么情况不可以,一般多...
在适合的情况下,可以考虑将一些轻量级的工具类设计为结构体。 总结,避免使用单例可以帮助我们写出更健壮、易于测试和维护的代码。通过以上提到的替代方案,我们可以更好地管理对象的生命周期,同时保持代码的灵活...
尽管双重检查锁定提供了一种较好的解决方案,但还存在一些问题。例如,在某些情况下,对象创建过程可能会被JVM指令重排序,导致线程A创建的对象尚未完全构造完成,而线程B已经能够访问到这个半成品对象。为了避免这...
日志类在此场景中的设计考虑了多线程安全。在多线程环境中,多个线程可能同时尝试写入日志,如果不加控制,可能会导致数据不一致或丢失。为了确保线程安全,日志类可能使用互斥量(mutex)或锁(lock)等同步原语来...
单例模式是软件设计模式中的一种基础且广泛应用的模式,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。在Java中,实现单例模式有多种...在理解了各种实现方式后,才能更好地利用单例模式解决实际问题。
它在多线程环境下是安全的,但比饿汉式稍微复杂一些,因为需要添加volatile关键字来确保可见性。 ```java public class SingleInstance3 { private volatile static SingleInstance3 instance; private ...
如果这些操作需要延后进行,你可能需要重新考虑单例的设计。 此外,Qt还提供了`QApplication::instance()`方法作为全局应用对象的单例,这可以用来访问和管理与应用程序相关的属性和行为。在实际开发中,结合使用这...
除了上述基本的单例实现,还有一些其他考虑因素,例如遵守`NSCopying`协议,以支持单例的复制行为。或者在iOS 8以后,可以利用`NSManagedContext`的单例来处理Core Data的多线程问题。 在实际项目中,我们可能会...
为了解决懒汉式单例的性能问题,可以使用双重检查锁定(Double-Check Locking,DCL)模式,它在确保线程安全的同时减少了同步开销: ```java public class Singleton { private volatile static Singleton ...