单例的正确姿势

1.加锁延迟性的懒汉单例模式

  单例对象需要用volatile去修饰,可以保证对象是公用的;

  初始化单例对象的方法,需要在方法内部判空后进行加锁再次判断空 new 对象的方式。

  优点:

    确保单例使用时,不会出现未初始化成功的情况(多线程频发并发去拿单例对象可能会造成对象没有初始化成功但不为null的情况)

  缺点:

    这是线程不安全的初始化单例对象的方法,因为不安全所以需要给变量加上共享标识,并且在初始化时加锁再次判定

2.静态内部类初始化外部类对象的单例模式

  通过静态内部类的静态方法,去new外部类的单例对象,可以真正意义上保证外部类单例对象正确存在,这也是线程安全的单例方法

时间: 2024-08-10 21:11:10

单例的正确姿势的相关文章

创建单例的正确姿势

方法 1: 声明 :+ (instancetype)sharedInstance  单例方法 重写:+ (instancetype)allocWithZone:(struct _NSZone *)zone (+(instancetype)alloc 和 +(instancetype)new 都会走 allocWithZone ,多以直接重写 allocWithZone 就ok了) - (instancetype)copy   - (instancetype)mutableCopy 完整代码: +

Swift中编写单例的正确方式

Swift中编写单例的正确方式 2015-12-07 10:23 编辑: yunpeng.hu 分类:Swift 来源:CocoaChina翻译活动 14 10647 Objective-CSwift单例 招聘信息: Cocos2d-x 工程师 cocos2dx手游客户端主程 wp开发 iOS开发工程师 iOS软件工程师 iOS研发工程师 iOS讲师 iOS开发工程师 iOS高级开发工程师 iOS 高级软件工程师 iOS高级开发工程师 本文由CocoaChina译者leon(社区ID)翻译自kr

单例的正确初始化方法

.h文件声明 + (MyHandle *)shareMyHandle; .m文件实现 #import "MyHandle.h" // 声明一个静态变量static MyHandle *myHandel = nil;@implementation MyHandle // 实现方法 + (MyHandel *)shareMyHandel { // 在GCD中只执行一次,用于记录是否执行过 static dispath_once_t onceToken; dispath_once(&

iOS开发之单例设计模式(完整正确版本)

单例的意思从字面上就可以略知一二,所谓单例就是确保在程序运行过程中只创建一个对象实例.可以用于需要被多次广泛或者说多次使用的资源中,比如我们常见的网络请求类.工具类以及其它管理类等.比如我iOS开发中常见的系统单例[UIApplication sharedApplication].[NSUserDefaults  standardUserDefaults]等.在iOS开发中,单例模式是非常有用的一种设计模式.如下图,是一个简单的例模式的UML类图. 一.使用单例模式的作用 它可以保证某个类在程序

Dagger2 使用正确姿势。

Dagger2 使用正确姿势. 上一篇文章<Dagger2 这次入门就不用放弃了>中介绍了Dagger2的一些显浅的使用方式,我觉得是非常适合入门Dagger2的傻瓜式讲解,后来发现有些内容讲的不够仔细,有些细节没有详细解释清楚.参考了以下三篇文章后,对之前的内容进行一些补充. Android:dagger2让你爱不释手-基础依赖注入框架篇 Android:dagger2让你爱不释手-重点概念讲解.融合篇 Android:dagger2让你爱不释手-终结篇 以上这三篇文章对于Dagger2的思

iOS 中的单例设计模式

单例设计模式:在它的核心结构中只包含一个被称为单例类的特殊类.例如文件管理中的NSUserDefault,应用程序中的UIApplication,整个应用程序就这一个单例类,负责应用程序的一些操作,单例在那个文件下都能取得到. 通过单例设计模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节省系统资源.如果希望在系统中某个类的对象只能存在一个,单例模式是最好的选择. 下面来点实在的,创建单例代码上 方法1:基于线程安全创建一个单例 .h做一下声明 + (id)

单例写法 转

如何正确地写出单例模式 1.懒汉式,线程不安全 这段代码简单明了,而且使用了懒加载模式,但是却存在致命的问题.当有多个线程并行调用 getInstance() 的时候,就会创建多个实例.也就是说在多线程下不能正常工作 public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInstance() { if (instance == nu

设计模式整理_单例设计模式

单例设计模式,它确保一个类只有一个实例,并提供一个全局访问点. 由于单例设计模式对应的类只能创建一个对象,因此它所对应的方法必须是static(不是static只有创建对象才能调用). 以下是单例模式的一个经典实现:采用了延迟加载对象的例子. public class Single1 { private static Single1 single; //利用一个静态变量来记录Single1的唯一实例,这里没有直接声明,采用了延迟加载模式. private Single1(){} //把构造器声明

单例(LintCode)

单例 单例 是最为最常见的设计模式之一.对于任何时刻,如果某个类只存在且最多存在一个具体的实例,那么我们称这种设计模式为单例.例如,对于 class Mouse (不是动物的mouse哦),我们应将其设计为 singleton 模式. 你的任务是设计一个 getInstance 方法,对于给定的类,每次调用 getInstance 时,都可得到同一个实例. 样例 在 Java 中: A a = A.getInstance(); A b = A.getInstance(); a 应等于 b. 挑战