关于“单例模式”的另外一种实现

  传统单例模式的实现有懒汉、饿汉等模式,也有双锁机制(防止不必要的线程再度进入锁的临界区实例化单例模式的全局变量)。不过据说(未经考证)在VS中CPU开启“out-of-order
execution”,仍然会导致出问题,原因在于:

  我们假设a和b线程同时试图初始化单例模式的全局变量,a先进入方法获得了锁,b慢了一拍,判断全局变量!=null之后只能徘徊在外边直到a好了位置。我们设想a线程初始化应该的步骤:

1)调用构造函数,产生实例对象。

   2)为全局变量分配栈和堆上的空间。

  3)将全局变量指向产生的实例对象。

  但是,可惜的是,一旦该优化开启之后,编译器变得“不听话了”,它会先1:为实例对象分配好空间,然后2:直接把全局变量指针指向该空间,最后3:才调用构造函数去“充实”实例。设想一下,如果是这样的话,b徘徊在外边,等到线程a刚完成2,b就发现全局变量已经不为null了!但是实例化构造函数尚未调用(或者调用中),结果会如何?!

  因此,如果没有必要延时加载,用“饿汉模式”或者直接写入静态构造函数的“懒汉模式”最好,否则需要根据动态反射等机制的,建议使用InternLock,类似以下代码:


 if(_instance==null)
{
Interlocked.CompareExchange<AbsDatabaseFactory>(ref _instance, (AbsDatabaseFactory)Assembly.LoadFile(pathwithFileName).CreateInstance(classTypeName), null);
Instance = _instance;
ConnectionString = connectionString;
}

  考虑到这是微软的方法,因此速度特快(尽管也有可能冒着“诞生几个类”的可能),但是应该不会出现错误的。大家以为呢?

时间: 2024-12-08 09:18:18

关于“单例模式”的另外一种实现的相关文章

iOS 单例模式实现的两种方式

简述面向对象应用程序中的单例类(singleton class)总是返回自己的同一个实例.它提供了对象所提供的资源的全局访问点.与这类设计相关的设计模式称为单例模式. 用一种只允许生成对象类的唯一实例的机制,“阻止”所有想要生成对象的访问. 这个方法应该是静态方法,因为让类的实例去生成另一个唯一实例毫无意义. 2.2 何时使用单例模式(1)类只能有一个实例,并且必须从一个为人熟知的访问点对其进行访问,比如工厂方法: (2)这个唯一的实例只能通过子类化进行扩展,而且扩展的对象不会破坏客户端代码.

单例模式你会几种写法?(转)

前言 只有光头才能变强 回顾前面: 给女朋友讲解什么是代理模式 包装模式就是这么简单啦 本来打算没那么快更新的,这阵子在刷Spring的书籍.在看Spring的时候又经常会看到"单例","工厂"这些字样. 所以,就先来说说单例和工厂设计模式啦,这两种模式也是很常见的,我看很多面经都会遇到这两种模式~ 本文主要讲解单例设计模式,如果有错的地方希望能多多包涵,并不吝在评论区指正! 一.单例模式概述 单例模式定义很简单:一个类中能创建一个实例,所以称之为单例! 那我们什么

单例模式创建的三种方式

一.单例模式的好处 1.对于频繁使用的对象,可以省略new操作花费的时间,这对于那些重量级对象而言,是非常可观的一笔系统开销: 2.由于new操作的次数减少,因而对系统内存的使用频率也会降低,这将减轻GC压力,缩短GC停顿时间. 二.创建方式 1)饿汉式 1 public class Singleton { 2     private Singleton(){ 3         System.out.println("Singleton is create"); 4     } 5 

OOAD之单例模式Singleton的6种写法

1  主要作用是保证在Java应用程序中,一个类Class只有一个实例存在. 一 :第一种 饿汉式(预加载) 1 public class Singleton { 2 private Singleton(){}////在自己内部定义自己一个实例,注意这是private 3 private static Singleton instance = new Singleton(); 4 5 public static Singleton getInstance() { 6 return instanc

Java单例模式实现的几种方式

单例模式好多书上都是这么写的: public class SingleTon1 { private SingleTon1(){ } private static SingleTon1 instance = null; public static SingleTon1 getInstance(){ if(instance == null){ instance = new SingleTon1(); } return instance; } } 但是实际开发中是不会这么写的,因为有一个严重的问题,多

单例模式实现的三种方式

1.什么是单例模式 单例模式:基于某种方法实例化多次得到实例是同一个2.为何用单例模式 当实例化多次得到的对象中存放的属性都一样的情况,应该将多个对象指向同一个内存,即同一个实例3.如何用''' # 单例模式实现方式一:# import settings## class Mysql:# __instacne=None## def __init__(self,ip,port):# self.ip=ip# self.port=port## @classmethod# def from_conf(cl

单例模式中的四种方式

1.什么是单例模式? 单例模式指的是多种不同的实例化指向同一个实例 2.为何要去用单例模式? 使用单例模式是为了减少资源的浪费 3.如何去用单例模式? 方式一: #先写一个setting模块用来存放(ip=None,port=None) import setting class Mysql: __instance=None def __init__(self,ip,port): self.ip=ip self.port=port @classmethod def srea(cls): if cl

单例模式作用特点及常见的单例模式分析(6种单例模式分析)

单例模式: 即在整个生命周期中,对于该对象的生产始终都是一个,不曾变化. 保证了一个类仅有一个实例,并提供一个访问它的全局访问点. 作用: 在要求线程安全的情况下,保证了类实例的唯一性,线程安全. 在不需要多实例存在时,保证了类实例的单一性.不浪费内存. 特点: 公有的方法获取实例, 私有的构造方法, 私有的成员变量. 一,饿汉式* @Description 饿汉式单例     * 饿汉式单例关键在于singleton作为类变量并且直接得到了初始化,即类中所有的变量都会被初始化     * si

23种设计模式(1):单例模式

转:http://blog.csdn.net/zhengzhb/article/details/7331369 ———————————————————————————————————————— 定义:确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 类型:创建类模式 类图: 类图知识点: 1.类图分为三部分,依次是类名.属性.方法 2.以<<开头和以>>结尾的为注释信息 3.修饰符+代表public,-代表private,#代表protected,什么都没有代表包可