美文网首页
iOS 三种单例创建方式的优缺点

iOS 三种单例创建方式的优缺点

作者: Mr_Dreams | 来源:发表于2021-05-18 13:06 被阅读0次

一、单线程模式单例

// 单线程单例
+(instancetype)sharedLoadData
{
  static Singleton *singleton;
  if (!singleton ) {
    singleton = [[Singleton alloc] init];
  }
  return singleton;
}

· 单线程单例只有在单个线程使用的情况下实用,在多线程的情况下,会产生线程不安全的情况。严格意义上来说,我们还需要把alloc方法变为私有方法才行,严格的单例是不允许再创建其他实例的,而alloc方法可以在外部任意生成实例。换句话说,假如在两条线程里调用sharedLoadData方法,可能会产生两个singleton实例,这样单例就失去意义了。

二、多线程加锁单例

// @synchronized加锁
+(instancetype)sharedLoadData
{
    static Singleton *singleton;
    @synchronized (self) {
    if (!singleton) {
        singleton = [[Singleton alloc] init];
      }
    }
    return singleton;
}

· 加锁以后,当多个线程同时调用shareInstance时,由于@synchronized已经加锁,只能有一个线程创建singleton实例。这样就解决了第一种情况的弊端。
但是也有缺点:只有在singleton未创建时,加锁才是必要的。如果singleton已经创建,这个时候还加锁的话,会影响性能。

三、系统GCD创建单例

+(instancetype)sharedLoadData
{
    static Singleton *singleton = nil;
    static dispatch_once_t onceToken;
    // dispatch_once  无论使用多线程还是单线程,都只执行一次
    dispatch_once(&onceToken, ^{
        singleton = [[Singleton alloc] init];
    });
    return singleton;
}

· GCD创建单例不仅可以解决多条线程的线程安全问题,也能保证性能,是官方推荐的方式。

· dispatch_once主要是根据onceToken的值来决定怎么去执行代码。
1.当onceToken = 0时,线程执行dispatch_once的block中代码
2.当onceToken = -1时,线程跳过dispatch_once的block中代码不执行
3.当onceToken为其他值时,线程被阻塞,等待onceToken值改变

· 当线程调用shareInstance,此时onceToken = 0,调用block中的代码,此时onceToken的值变为140734537148864。当其他线程再调用shareInstance方法时,onceToken的值已经是140734537148864了,线程阻塞。当block线程执行完block之后,onceToken变为-1.其他线程不再阻塞,跳过block。下次再调用shareInstance时,block已经为-1.直接跳过block。

相关文章

  • iOS 三种单例创建方式的优缺点

    一、单线程模式单例 单线程单例只有在单个线程使用的情况下实用,在多线程的情况下,会产生线程不安全的情况。严格意义上...

  • iOS 三种单例创建方式的优缺点

    一、单线程模式单例 · 单线程单例只有在单个线程使用的情况下实用,在多线程的情况下,会产生线程不安全的情况。严格意...

  • iOS单例的三种创建方式

    INTRO:iOS中有很多单例的应用,单例模式就是确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例...

  • iOS 单例模式 - 单例对象销毁【@synchronized】

    单例对象的创建方式 单例.h 文件的实现 单例.m 文件的实现 单例对象的销毁【@synchronized创建方式...

  • 单例模式的常用实现方式

    单例模式属于最常用的设计模式,Java中有很多实现单例模式的方式,各有其优缺点 实现方式对比 单例实现方式线程安全...

  • iOS 单例模式 - 单例对象销毁【GCD】

    单例对象的创建方式 单例.h 文件的实现 单例的.m 文件的实现 单例对象的销毁【GCD创建的方式】 使用单例对象...

  • 8. 单例

    单例 1、GCD方式创建单例 2、互斥锁方式 销毁

  • Swift 单例传值

    回顾 Objc 创建单例的方式: 1.创建单例 2.给单例的属性赋值 3.输出单例的属性值

  • iOS-singleton(单例)三种创建方式

    单例介绍 单例模式: 一个类只有一个实例对象。 使用场合:在整个应用程序共享一份资源(这份资源只需要创建初始化一次...

  • iOS-singleton(单例)三种创建方式

    单例介绍 单例模式: 一个类只有一个实例对象。 使用场合:在整个应用程序共享一份资源(这份资源只需要创建初始化一次...

网友评论

      本文标题:iOS 三种单例创建方式的优缺点

      本文链接:https://www.haomeiwen.com/subject/xvwejltx.html