`
liuxi1024
  • 浏览: 391093 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

设计模式--Singleton pattern and Double-checked locking

阅读更多

1、定义

Head First -Design Pattern》 一书中定义其作用如下:

     The Singleton Pattern ensures a class has only one instance, and provides a global point of access it. (确保每个类只有一个实例,并提供它的全局访问点)

 

2、两种形式

(1)使用"急切"创建实例

 

public class SingletonPatternA {
	private static SingletonPatternA instance = new SingletonPatternA();

	private SingletonPatternA() {
	};

	public static SingletonPatternA getInstance() {
		return instance;
	}
}

  说明:

   *在静态初始化器中创建单件,保证线程安全。

   * 构造方法为私有

 

(2)使用延迟实例化

public class SingletonPatternB {
	private static SingletonPatternB uniqueInstance;

	private SingletonPatternB() {
	}

	public static synchronized SingletonPatternB getInstance() {
		if (uniqueInstance == null)
			uniqueInstance = new SingletonPatternB();
		return uniqueInstance;
	}
}

 说明:

    *利用静态变量

    *构造方法为私有

    *getInstance()存在着线程安全问题,所以要增加synchronized关键字。

 

3、由于synchronized getInstance() 同步一个方法可能使程序执行效率下降100倍,利用“double-checked locking ”来减少getInstance()方法必须是sychronized的改进。

 

public class SingletonPatternC {
	private static volatile SingletonPatternC singleton;

	private SingletonPatternC() {
	}

	public static SingletonPatternC getInstance() {
		if (singleton == null) {
			synchronized (SingletonPatternC.class) {
				if (singleton == null) {
					singleton = new SingletonPatternC();
				}
			}
		}
		return singleton;
	}
}

 注意:在1.4及更早版本的java中,许多JVM对volatile关键字的实现会导致"双重检查加锁"的失效,如果使用1.4及以下java版本请不要使用volatile关键字。

 

 

分享到:
评论

相关推荐

    adv-java-factory-singleton

    本项目"adv-java-factory-singleton"显然关注的是Java设计模式中的两个关键概念:工厂模式(Factory Pattern)和单例模式(Singleton Pattern)。这两种模式是软件设计模式中的基础,对于理解和构建可扩展、易于维护...

    Singleton Pattern 源码

    单例模式(Singleton Pattern)是软件设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下非常有用,比如控制资源的唯一性、全局配置对象或者缓存服务等。本篇文章将深入探讨...

    java之 ------ 几种常见的简单设计模式

    - 可以通过双重检查锁定(Double-Checked Locking)优化性能。 **线程安全问题及解决方案** - **问题**:在多线程环境中,若不采取措施,则可能会导致单例模式失效,即生成多个实例。 - **解决方案**: - 使用`...

    设计模式C++ 04-05

    在C++中实现单例,需要注意线程安全问题,可能会使用到静态成员变量、双重检查锁定(Double-Checked Locking)以及C++11的std::call_once和std::once_flag等工具来确保正确性。 第5章可能会讲解“工厂模式”...

    C++完美实现Singleton模式

    Singleton模式是一种常用的软件设计模式,旨在确保一个类只有一个实例,并提供一个全局访问点。这种模式在系统中经常被用于控制对共享资源(如数据库连接、日志对象等)的访问。正确地实现Singleton模式对于提高代码...

    Java_在终极设计模式包中掌握经典设计模式和实际示例.zip

    在Java中,可以通过静态内部类、枚举或双检锁(Double-Checked Locking)等方式实现单例。 其次,工厂模式(Factory Pattern)是创建型设计模式,它提供了一种创建对象的最佳方式,通过一个公共接口来创建特定类型...

    Head-First-Design-Patterns-master设计模式官方源码

    在Java中,通常使用双重检查锁定(Double-Checked Locking)或者静态内部类的方式来实现。 4. 建造者模式(Builder Pattern):建造者模式将复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。...

    经典设计模式

    单例模式(Singleton Pattern)是设计模式中的一种,其主要意图是限制类的实例化次数,确保一个类只有一个实例,并提供一个全局访问点。这样的设计可以避免过多的实例化导致的资源浪费,特别是在需要全局共享资源...

    Java 设计模式 课件 PPT

    在Java中,通常通过双重检查锁定(Double-Checked Locking)或静态内部类方式实现单例。 接着是工厂模式(Factory Pattern),它是一种创建型设计模式,提供了创建对象的接口,但允许子类决定实例化哪个类。工厂...

    C#设计模式(word文档)

    单例模式需要注意线程安全问题,如双重检查锁定(Double-Checked Locking)等实现方式。 - **抽象工厂(Abstract Factory)**:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。 - **建造者...

    设计模式面试专题.pdf

    在Java中,通过私有构造器和静态方法来实现,线程安全的单例可以使用枚举或双重检查锁定(double-checked locking)来创建。例如: ```java public enum Singleton { INSTANCE; } // 或者使用双重检查锁定 public...

    二十三种设计模式【PDF版】

    设计模式之 Singleton(单态/单件) 阎宏博士讲解:单例(Singleton)模式 保证一个类只有一个实例,并提供一个访问它的全局访问点 设计模式之 Factory(工厂方法和抽象工厂) 使用工厂模式就象使用 new 一样频繁. ...

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

    单件模式(Singleton Pattern)是软件设计模式中最为常见的一种,它的主要目标是确保某个类只有一个实例,并提供一个全局访问点。单件模式在很多情况下都非常有用,比如管理共享资源(如内存、文件句柄等)、作为...

    C#设计模式(23种设计模式)

    为了确保线程安全,可以使用懒加载技术或双重检查锁定(Double-Checked Locking)机制。 #### 2. 抽象工厂模式(Abstract Factory) 抽象工厂模式提供了一个接口,用于创建一系列相关的或相互依赖的对象,而无需...

    设计模式Java语言中的应用

    在Java中,可以使用静态内部类、枚举或者双检锁(Double-Checked Locking)等方式实现单例,以保证线程安全并避免过早初始化。 3. 构造器模式(Builder Pattern): 构建者模式是一种创建型设计模式,它将复杂对象...

    设计模式java代码实现

    在Java中,通常使用双重检查锁定(Double-Checked Locking)或者静态内部类的方式来实现线程安全的单例。 3. 建造者模式(Builder Pattern): 建造者模式是一种创建型设计模式,它将复杂对象的构建与其表示分离,...

    \Java第四十一——四十二讲总结-设计模式.doc

    3. **双重检查锁定(DCL,Double Checked Locking)** - **概念**:结合了懒汉式和饿汉式的优点,既保证了线程安全又提高了效率。 - **代码示例**: ```java public class Singleton { private volatile static...

    java设计模式

    Java8引入了新的特性,如lambda表达式和方法引用,这些可以帮助我们更简洁地实现单例,例如使用`Double Checked Locking`(双重检查锁定)或者`Enum Singleton`(枚举单例)。 再次,构造器模式(Builder Pattern)...

    2 单例模式-MOOC课程内容.pdf

    为了保证线程安全,可以使用双重检查锁定模式(Double-Checked Locking Pattern),确保只有一个实例被创建。但是这要求必须使用关键字volatile修饰静态实例变量,以防止指令重排序导致的问题。单例模式1和单例模式2...

    北邮 java 作业6 设计模式1

    此外,还要注意线程安全问题,例如双检锁定(Double-Checked Locking)或枚举单例等实现方式。 其次,工厂模式(Factory Pattern)是一种创建型设计模式,它提供了一种创建对象的最佳方式。工厂模式定义了一个用于...

Global site tag (gtag.js) - Google Analytics