`

单件模式多线程环境下实现

阅读更多

 参考《Head First 设计模式》

单件模式 定义:确保一个类只有一个实例,并提供一个全局的访问点。

 

单件模式如果没有做同步处理,在多线程环境下很容易造成出现多个实例情况。一下三种实现方式可以解决这个问题。

实现一:

 

public class Singleton {
	private static Singleton uniqueInstance;
	// other useful instance variables here
	private Singleton() {}
	public static synchronized Singleton getInstance() {
		if (uniqueInstance == null) {
			uniqueInstance = new Singleton();
		}
		return uniqueInstance;
	}
	// other useful methods here
}

 

 此方法是好理解的一种,但是有个缺陷,在每次调用getInstance()方法都需要进行代码同步,所以代码执行效率会有所降低。还有单例模式在创建实例后就不需要进行同步处理了,如果在调用程序频繁且对性能要求较高的地方尽量少使用此方法。

 

实现二(急切创建实例):

 

public class Singleton {
	private static Singleton uniqueInstance = new Singleton();
 
	private Singleton() {}
 
	public static Singleton getInstance() {
		return uniqueInstance;
	}
}

 利用这种做法,JVM在加载这个类是就马上创建此唯一的单件实例。JVM保证在任何线程访问uniqueInstance变量之前,一定先创建此实例。在静态初始化器中创建单件,保证了线程安全

如果程序总是创建并使用单件实例,或者在创建和运行时方面的负担不太繁重,可以考虑此方法。

 

 实现三(双重检查加锁):

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;
	}
}

 

 首先检查是否创建实例了,如果未创建才进行同步。这样一来,只有第一次才会进行同步。第一次执行时。进入同步代码块后在检查一次,这样做确保多个线程执行时,创建唯一实例。如果仍是null,才创建实例。

注意此处用到volatile 修饰符,确保变量uniqueInstance被初始化成Singleton实例时,多个线程立即可见

。 

分享到:
评论

相关推荐

    c++实现单件模式 c++实现单件模式 c++实现单件模式

    单件模式(Singleton Pattern)是设计模式中...总的来说,单例模式在C++中的实现涉及类的设计、构造函数的控制、静态成员的使用以及多线程环境下的同步策略。理解并掌握这些知识点,对于编写高效、可靠的代码至关重要。

    设计模式 之 单件模式

    - **线程安全的实现**:通过添加锁(如C#中的`lock`语句)来保证在多线程环境下的线程安全性,确保同一时间只有一个线程能够执行实例化操作。这种方式解决了简单实现的线程安全问题,但可能导致线程阻塞,影响性能。...

    单件模式试做--static的使用

    4. 如果担心多线程环境下可能出现多个实例,可以使用同步机制(如synchronized关键字)来确保getInstance方法在多线程环境中的线程安全。 以下是一个简单的Java单件模式示例: ```java public class Singleton { ...

    基于C#的设计模式中的单件模式

    这是一种在多线程环境下保证线程安全的懒汉式实现,它减少了同步的开销。 ```csharp public sealed class Singleton { private static volatile Singleton instance; private static object syncRoot = new object...

    设计模式之单件模式

    在多线程环境下,既保证了线程安全,又避免了同步带来的性能问题。 ```java public class Singleton { private volatile static Singleton INSTANCE; private Singleton() {} public static Singleton ...

    C#设计模式,单件模式,C#代码

    但这种方式线程不安全,可能会在多线程环境下创建多个实例。 ```csharp public class Singleton { private static Singleton instance; private Singleton() {} public static Singleton Instance { get { ...

    单件模式源代码

    这里的`getInstance`方法使用了互斥锁`mutex`来保证多线程环境下的安全性。 3. 双重检查锁定(Double-Checked Locking):既实现了延迟初始化,又保证了线程安全,是一种优化的懒汉式。 ```cpp class Singleton ...

    设计模式_--_工厂模式和单件模式

    - **双重检查锁定**:在多线程环境下,确保线程安全的同时提高效率。 **4. 示例代码** 这里以懒汉式为例简要说明单例模式的实现: ```cpp class Singleton { private: static Singleton* instance; Singleton()...

    深入浅出设计模式之单件模式

    - 优点:避免了多线程下的同步问题,提高了运行效率。 - 缺点:可能会造成资源浪费,尤其是在实例创建成本较高时。 #### 四、单件模式的应用场景 1. **日志对象**:单例模式可以用于管理全局的日志记录器,确保...

    数据库连接-单件模式

    尽管文件列表中提到了`MySQL`,但在“数据库连接-单件模式”的主题下,我们通常讨论的是如何在SQL Server环境下应用单例模式。不过,单例模式的概念和实现方式在MySQL或其他数据库系统中也是类似的,只是具体的...

    Head First 设计模式 (五) 单件模式(Singleton pattern) C++实现

    但这种方式在多线程环境下可能存在问题,因为多个线程可能会同时进入`getInstance`,从而创建多个实例。 ```cpp class Singleton { private: Singleton() {} Singleton(const Singleton&) = delete; Singleton...

    单件模式Sigleton范例

    在这个版本中,`volatile`关键字确保了多线程环境下的可见性,而`lock`语句则保证了同步,确保了在任何时刻只有一个线程能够创建`Signal`实例。 总结一下,单件模式是一种限制类实例化的模式,保证了全局只有一个...

    用单件模式写的写日志文件(VC版)

    4. **线程安全**:考虑到多线程环境,`getInstance()`方法可能需要添加互斥锁(mutex)或原子操作来确保在并发情况下也能正确地创建和返回单例。 以下是一个简单的`WriteLog`类的单件模式实现示例: ```cpp #...

    单件实现范例

    6. **测试单例**:在TestSingle中,我们可能看到对单例模式的单元测试,验证`getInstance()`方法是否能正确返回唯一的实例,以及在多线程环境下是否保持线程安全。 总结起来,"单件实现范例"是一个关于如何在实际...

    单件模式的演变到n件模式

    3. 线程安全:在多线程环境下,确保对象的获取和释放过程不会引发数据竞争。 4. 对象的公平性:在多个线程同时请求对象时,需要保证公平性,避免某些线程长时间等待。 对于给定的“moshi2_02”文件,虽然没有具体...

    单件模式的C++标准实现.docx

    此外,如果程序在多个线程环境中运行,还需要考虑线程安全问题,确保`Instance()`方法的线程安全性。 总之,单件模式在特定情况下提供了对唯一实例的有效管理,但在设计时应谨慎使用,避免滥用导致不必要的复杂性和...

    单件模式demo

    但是这种方式在多线程环境下可能存在问题,因为多个线程可能会同时创建单例对象。 ```csharp public class Singleton { private static Singleton instance; private Singleton() {} public static Singleton ...

    设计模式\单件模式VS2005

    单件模式(Singleton Pattern)是软件设计模式中的一种经典模式,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下非常有用,比如配置管理、线程池、数据库连接等需要全局唯一的...

    设计模式——单实例模式、单件模式——Java编写

    在这个DCL实现中,volatile关键字确保了多线程环境下对instance的可见性和有序性,防止出现线程间的脏读问题。这里的关键在于两次检查instance是否为null,第一次是为了避免不必要的同步,第二次是在同步区域内创建...

    [创建型模式] head first 设计模式之单件模式(Singleton)

    2. **懒汉式(线程不安全)**:在类被加载后,第一次调用`getInstance`方法时才进行初始化,不考虑多线程环境,可能导致多个实例。 ```java public class Singleton { private static Singleton instance; ...

Global site tag (gtag.js) - Google Analytics