`
annan211
  • 浏览: 462663 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

并发模式下的单例创建

 
阅读更多
  单例模式的创建 分为很多种,这里就不一一列举,这里简单分析一下单例模式的效率和线程安全性。
   传统的单例模式是

  
   package thread;

public class SingletoDemo {

	public static SingletoDemo instance = null;
	/**
	 * 私有化
	 */
	private SingletoDemo(){}

	public static SingletoDemo getInstance(){
		if(instance == null){
			instance = new SingletoDemo();
		}
		return instance;
	}
}

   


   为了 实现 线程安全性,出现了如下的 进化   
      package thread;

public class SingletoDemo {

	public static SingletoDemo instance = null;
	/**
	 * 私有化
	 */
	private SingletoDemo(){}

	public static synchronized SingletoDemo getInstance(){
		if(instance == null){
			instance = new SingletoDemo();
		}
		return instance;
	}
}

    


  但是上面代码的开销 有点不合适,因为每个线程 都会来判断锁。所以 出现了 双重判定。
 
   package thread;

public class SingletoDemo {

	public static SingletoDemo instance = null;
	/**
	 * 私有化
	 */
	private SingletoDemo(){}

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

  

  
但是 判断锁 还是存在的,如果我们仅仅是需要在 一种比较合理的,没有特殊情况发生的环境下 创建单例,是不是有那么一种方法,不需要出现判断锁的呢?(这里所说的 特殊情况是指,通过反射机制,强行调用私有构造函数,创建多个实例,还有一种情况就是 序列化和反序列化(通过串行方式))
假定我们假设以上的情况是不多见或者说 在我们的程序当中是不存在不会发生的,那么我们的代码可以有如下实现。

 
   package thread;

public class SingletoDemo {

	public static class InnerSingletoDemo{
		public static InnerSingletoDemo instance = new InnerSingletoDemo();

		public static InnerSingletoDemo getInstance(){
			return InnerSingletoDemo.instance;
		}
	}
}
  

  
通过代码 我们可以观察出,这段代码是通过内部类的形式 来实现单例的。
在这实现中,单例模式通过内部类来维护单例的实例,当SingletoDemo 外部类被加载 时,
其内部类并不会被初始化,故可以确保外部类被载入jvm时,其内部类不会被初始化,当getInstance()方法被调用时,才会加载内部类从而初始化单例对象,
由于实例的创建是在类加载时完成,因此天生对多线程友好,所以可以省去synchronized关键字。

使用内部类实现单例,既可以实现延迟加载,又可以省去synchronized关键字实现同步,是一种比较完善的实现方式。

但是 我们必须注意上面所说的 特殊情况。

分享到:
评论

相关推荐

    43丨单例模式(下):如何设计实现一个集群环境下的分布式单例模式?1

    在单例模式中,类的构造函数是私有的,防止外部直接创建对象,而是通过静态方法获取该类的唯一实例。单例模式的唯一性通常是在进程范围内,即在同一个进程中,无论何时调用单例类的获取实例方法,都会返回相同的对象...

    设计模式单例模式

    这种方式在类加载时创建单例,但由于单例创建在静态内部类中,所以只有在调用`getInstance()`时才会加载`SingletonHolder`,实现了延迟初始化,同时也保证了线程安全。 3. **同步枷锁**(Synchronized):在多线程...

    Java设计模式之单例模式的七种写法

    2、单例类必须自己创建自己的唯一实例。 3、单例类必须给所有其他对象提供这一实例。 在 Java 中,单例模式的写法有好几种,主要有懒汉式单例、饿汉式单例、登记式单例等。 懒汉式单例是一种常见的单例模式实现...

    多线程单例模式并发访问

    ### 多线程单例模式并发访问 #### 一、多线程基础概念 在讨论多线程单例模式及并发访问之前,我们先来了解一些基本概念。 **进程**和**线程**是计算机科学中的两个核心概念,它们之间的关系紧密而复杂。 - **进程...

    设计模式之单例模式

    在第一次请求时才创建单例对象,但这种方式线程不安全,多线程环境下可能导致创建多个实例。 4. 双重检查锁定(DCL,线程安全): 使用双重检查来确保线程安全,即先检查实例是否已经创建,再进行同步操作创建...

    JAVA多线程并发下的单例模式应用

    JAVA多线程并发下的单例模式应用 单例模式是设计模式中比较简单的一个,也是非常常见的,但是在多线程并发的环境下使用却是不那么简单了。今天我们将分享一个在开发过程中遇到的单例模式的应用。 单例模式的定义:...

    常见设计模式-单例模式

    3. Spring框架如何处理并发环境下单例对象的创建和管理? 4. 如何通过反射或序列化破坏单例模式的唯一性,以及如何防御? 5. 如何在保证单例模式的同时,增加可配置性或者实现不同实例的切换? 理解并熟练掌握单例...

    游戏角色创建程序(单例模式)

    单例模式可以确保只有一个角色创建的实例存在,这样所有对角色创建的请求都会导向同一个实例,避免了重复创建和潜在的并发问题。 在Java中,实现单例模式有多种方法,比如懒汉式、饿汉式和双重检查锁定等。懒汉式是...

    白话讲解创建型设计模式:单例原型构建

    本文将聚焦于创建型设计模式,特别是单例模式和原型模式,这两种模式在对象的创建方面扮演着重要的角色。 单例模式是一种限制类实例化次数的设计模式,确保在整个应用程序中,一个类只有一个实例存在。这在某些场景...

    单例多例模式

    在Spring框架中,默认情况下是单例模式。如果要产生多例,则需要在配置文件的bean中添加scope="prototype"。这将告诉Spring框架为每个请求创建一个新的对象实例。 三、为什么要用单例多例? 单例模式的优点是能够...

    设计模式——单例

    设计模式是软件工程中的一种最佳实践,用于解决在不同场景下重复出现的问题。单例模式是一种常用的设计模式,它的核心思想是确保一个类只有一个实例,并提供一个全局访问点。这样做的目的是为了控制对象的创建,特别...

    01 设计模式之单例模式.pdf

    在设计时,需要考虑类的线程安全性,确保在并发环境下也能保持其单例的特性。 根据提供的文件内容,可以得知,单例模式的实现方式在Java中有很多种,每种都有其使用场景和优缺点。在实际应用中,选择合适的单例模式...

    Java单例模式应用研究.pdf

    单例模式(Singleton Pattern)作为一种最基本的创建型设计模式,其主要目的是控制一个类的实例化过程,确保在整个应用程序中仅存在一个实例,并且该实例能够被全局访问。这种模式在实际软件开发中有着极其广泛的应用...

    Python编程实战 运用设计模式、并发和程序库创建高质量程序

    在Python编程领域,为了创建高质量的程序,设计模式、并发处理和有效利用程序库是至关重要的元素。本书“Python编程实战 运用设计模式、并发和程序库创建高质量程序”旨在帮助开发者掌握这些核心概念,从而提升代码...

    设计模式-Java单例模式的各种实现实例

    单例模式具有一定的“防并发作用”,由于单例模式只生成一次实例化对象,可以减少系统内存的开销,特别是对于多线程单例,即可以在系统启动时完成实例化,避免对资源的重复占用。 单例模式可以作为程序中的“全局锁...

    你想要Android数据库操作精华(安全、并发、单例等)

    本Demo——"你想要的Android数据库操作精华(安全、并发、单例等)",旨在深入探讨如何在Android Studio环境下进行高效且安全的数据库操作,包括使用数据库框架、数据库加密、并发控制以及单例模式的应用。...

    c++单例模式线程日志类

    单例模式的主要目的是限制类的实例化,防止无控制的创建多个对象,尤其是当这个类需要频繁地进行全局共享或者资源管理时。在C++中,通常通过私有构造函数和静态成员函数来实现单例。静态成员函数确保只有一个实例被...

Global site tag (gtag.js) - Google Analytics