单例模式(Singleton)续——有效解决多线程问题
《JDK源码解析》的分支,讲解设计模式在jdk中使用。
上一篇博客,讲到了单例模式(Singleton),提到了多线程问题。这次,我们来看看几个有效解决单例模式中多线程问题的解法。
上一篇博客提到的最后一种方法,虽然能解决多线程环境下的问题,但是有效率低下的缺点,因为每次使用getInstance()方法时,都会synchronized,明显影响效率。
一、”两次判断法“(效率依然会有影响)
public class SingletonTest { private static SingletonTest singletonTest = null; private static Object syncObj = new Object(); private SingletonTest() { } public static SingletonTest getInstance() { if (null == singletonTest) //第一次判断 { synchronized (syncObj) { if (null == singletonTest) //第二次判断 { singletonTest = new SingletonTest(); } } } return singletonTest; } }
结论:
(1)这样会使得当第一次判断为false的时候,不进入同步块,使得效率比原方法高。
(2)但是:两次判断,使得代码复杂易错,不是很推荐。
二、”静态成员变量法“(上一篇博客已讲)
public class SingletonTest { //在类里面实例化静态成员变量 private static SingletonTest singletonTest = new SingletonTest(); private SingletonTest() { } public static SingletonTest getInstance() { return singletonTest; } }
结论:
(1)使用类的构造方法时初始化静态变量,创建唯一的静态实例。
(2)简洁,效率高!(无锁)
(3)但是:因为只要使用SingletonTest类,默认创建实例(不管需不需要这个实例)。这种默认创建实例,会导致内存使用效率的降低!
三、”按需创建“方法(感谢fisher123的指点)
public class SingletonTest { private SingletonTest() { } private static class Inner //私有的静态内部类 { static SingletonTest singletonTest = new SingletonTest(); } public static SingletonTest getInstance() { return Inner.singletonTest; } }
结论:
(1)私有的静态内部类,当不调用getInstance()方法时,就不会调用这个内部类,就不会产生实例。
(2)没有使用锁,没有产生无用的实例。确实是最好的方法。
相关推荐
**设计模式——单例模式** 在软件工程中,设计模式是一种在特定场景下解决常见问题的标准方案,可以被复用并提升代码质量。单例模式是设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。这种模式...
上述懒汉式的实现方式在多线程环境中会出现问题,可能导致多个线程同时创建单例实例。为了解决这个问题,可以使用synchronized关键字对`getInstance()`方法进行同步,确保同一时间只有一个线程能执行该方法: ```...
1. `volatile`关键字确保了多线程环境下的可见性和有序性,防止了多个线程同时创建单例实例。 2. 第一次检查避免了不必要的同步,只有当实例为null时,才进行同步操作。 3. 在同步块内部进行第二次检查,确保在多...
总的来说,策略模式和单例模式都是为了解决特定问题而设计的,它们提供了灵活性和控制力,帮助我们编写更加健壮、可维护的代码。理解并熟练掌握这些设计模式,对于提升软件开发的质量和效率大有裨益。
单例模式是软件设计模式中的一种,它的主要目的是确保一个...理解并熟练运用单例模式以及其他设计模式,能有效提高代码质量和可维护性。在实际项目中,开发者可以根据场景灵活选择合适的设计模式,提升软件的架构质量。
因此,通过单例模式实现的日志处理机制可以有效避免这类问题的发生。 **5. Web应用的配置对象读取** 配置文件是Web应用运行的基础,它们通常包含敏感信息或关键设置。为了保证这些信息的安全性及一致性,往往采用...
这是最简单的一种实现方式,它在类加载时就完成了实例化,避免了多线程同步问题。 ```java public class Singleton { private static final Singleton INSTANCE = new Singleton(); private Singleton() {} ...
设计模式是在软件工程领域内被广泛采用的一种最佳实践,其目的在于提供通用解决方案以解决在软件设计过程中遇到的常见问题。其中,《Head First 设计模式》是一本广受好评的设计模式入门书籍,非常适合初学者学习。...
为了使"懒汉式"单例在多线程环境下安全,可以使用synchronized关键字来同步方法: ```java public class Singleton { private static Singleton instance; private Singleton() {} public synchronized static ...
这里我们将详细探讨标题中提到的两种单例模式——"懒汉式"(Lazy Initialization)和"饿汉式"(Eager Initialization)。 1. **饿汉式单例模式** 饿汉式单例的特点是类加载时就完成了实例化,确保了线程安全,但...
单例模式是软件设计模式中的一种经典模式,它限制了类的实例化过程,确保一个类在整个系统中只有一个实例存在。这种模式在处理全局资源、线程共享对象以及频繁使用的对象时尤其有用,因为它可以避免频繁创建和销毁...
在软件开发中,设计模式是解决常见问题的模板,它们是经过时间和实践验证的最佳实践。本次我们将深入探讨两种设计模式——单例模式和装饰模式,它们在Java编程中都有着广泛的应用。 首先,让我们来理解“单例模式”...
2. 线程安全:在多线程环境下,确保单例的初始化过程是线程安全的。在Swift中,由于全局常量的线程安全性,静态实例变量通常无需额外处理。但在Objective-C中,可能需要添加锁来保证线程安全。 3. 生命周期管理:...
这种方式在多线程环境下可能会出现问题,因为多个线程可能会同时通过`null`检查并创建新的实例,破坏单例模式。 ```java public class Singleton { private static Singleton instance; private Singleton() {} ...
在多线程或者跨平台的C#应用中,抽象工厂可以帮助我们隔离产品族,使得更换产品族变得容易。例如,我们可以有一个GUI元素的抽象工厂,针对Windows和Linux分别实现具体的工厂,这样在切换操作系统时只需替换工厂即可...
标题和描述所提到的"singleton_crash"就是这种情况的一个实例,它探讨了当静态库被多个动态库链接时,单例模式可能导致的崩溃问题。 在C++编程中,静态库和动态库有着不同的加载和链接机制。静态库在编译时会被直接...
- **线程安全**:在多线程环境下,需要确保 `getInstance` 方法是线程安全的,避免并发时创建多个实例。在 TypeScript 或 JavaScript 中,由于它们通常运行在单线程环境中,这个问题通常不需要考虑,但在服务器端如...
单例模式是设计模式中的一种,它用于控制类的实例化过程,确保在整个应用程序中,对于特定类,只有一个实例存在。这种模式常被用来管理共享资源或者全局配置,以提高性能和减少系统间的耦合。 单例模式的核心在于...