关于双重检查创建单例对象

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

  利用双重检查创建单例对象: 在获取实例getInstance()的方法中, 首先判断instance是否为空, 如果为空, 则锁定Singleton.class并再次检查instance是否为空, 如果还为空则创建一个Singleton实例

  假设有A,B两个线程同时调用getInstance()方法, 他们会同时发现instance == null, 于是同时对Singleton.class加锁, 此时JVM保证只有一个线程能加锁成功(假设是A), 另外一个线程则会处于等待状态(假设是B); 线程A会创建一个Singleton实例, 之后释放锁, 锁被释放后, 线程B被唤醒, 此时B可以加锁, 加锁成功后, 线程B检查instance == null 时发现已经创建过Singleton实例, 所以B不会再创建一个Singleton实例

原文地址:https://www.cnblogs.com/zhuoweichang/p/10566789.html

时间: 2024-08-24 10:09:22

关于双重检查创建单例对象的相关文章

iOS:创建单例对象的两种方式

单例模式:创建单例对象的两种方式 方式一:iOS4版本之前 static SingleClassManager *singleManager = nil; +(SingleClassManager*)sharedManager { @synchronized(self)  //同步加锁,在多线程中使用,可以使线程安全 { if(singleManager == nil) { singleManager = [[SingleClassManager alloc]init]; } } return

使用多线程创建单例对象

#import "ZKZApplication.h" @implementation ZKZApplication +(instancetype)allocWithZone:(struct _NSZone *)zone { static ZKZApplication *application; // dispatch_once是线程安全的,onceToken默认为0 static dispatch_once_t onceToken; // dispatch_once宏可以保证块代码中的

scala学习手记14 - 单例对象

java中的单例模式都很熟悉了:简单地说就是一个类只能有一个实例.在scala中创建单例对象非常简单,创建类时使用object关键字替换class即可.因为单例类无法初始化,所以不能向它的主构造函数传递参数. 下面是一个单例的示例: class Marker(val color: String) { println("Creating " + this) override def toString(): String = "marker color " + colo

不允许在单例对象中创建Srping容器

spring.net在使用的时候,不允许在单例对象中创建Srping容器 需要将实例化模式转为单例singleton=“false”

【cocos2d-js官方文档】二十五、Cocos2d-JS v3.0中的单例对象

为何将单例模式移除 在Cocos2d-JS v3.0之前.全部API差点儿都是从Cocos2d-x中移植过来的,这是Cocos2d生态圈统一性的重要一环.可惜的是,这样的统一性也在非常大程度上限制了Cocos2d-html5的发展,有一些在C++中非常有意义的涉及搬到Html5平台后却使得Cocos2d-html5变得臃肿.所以在3.0版中,我们决定将一些API改造成更适合JavaScript开发者的API.这篇文档中将要展示的是单例类的改造. 拿cc.SpriteFrameCache为例: /

单例对象

在开发中经常需要使用单例对象.今天主要说的是单例宏 首先先简单介绍一下 1.单例设计模式(Singleton) 1> 什么: 它可以保证某个类创建出来的对象永远只有1个 2> 作用(为什么要用) * 节省内存开销 * 如果有一些数据, 整个程序中都用得上, 只需要使用同一份资源(保证大家访问的数据是相同的,一致的) * 一般来说, 工具类设计为单例模式比较合适 3> 怎么实现 * MRC(非ARC) * ARC 代码采用的是mrc的环境 单独创建一个.h文件 例如SingleTon.h

【Scala】单例对象与伴生对象

Scala的单例对象 Scala不能定义静态成员,而是代之定义单例对象(singleton object).以object关键字定义. 对象定义了某个类的单个实例,包含了你想要的特性: object Accounts{ private var lastNumber = 0 def newUniqueNumber() = { lastNumber += 1; lastNumber} } 当你在应用程序中需要一个新的唯一账号时,调用Account.newUniqueNumber()即可. 对象的构造

【Spring实战】—— 3 使用facotry-method创建单例Bean总结

如果有这样的需求: 1 不想再bean.xml加载的时候实例化bean,而是想把加载bean.xml与实例化对象分离. 2 实现单例的bean 以上的情况,都可以通过工厂方法factory-method来创建bean. 这样再加载bean.xml时,不会直接实例化bean,而是当调用factory-method所指的方法时,才开始真正的实例化. 首先看一下传统的单例模式的实现方式: 1 最原始的实现单例模式的方法(存在线程不安全): public class SingletonOne { pri

iOS中创建单例的两种方式

刚刚开始做iOS开发的时候,不知道怎么创建单例,在网上搜的也大多数都不太全,所以总结了一下创建单例的两种方式 首先在.h文件中声明类方法 1 +(instancetype)sharedUtils; 然后在.m文件中实现它,实现的方法有两种 第一种,在创建一个对象时先判断在程序中有没有创建过这个对象 1 static PublicUtils *DefaultManager = nil; 2 3 +(instancetype)sharedUtils 4 { 5 if (!DefaultManager