zoukankan      html  css  js  c++  java
  • Objective-C中单例

    单例模式,由于其简单好用容易理解、同时在出问题时也容易定位的特点,在开发中经常用到的一个设计模式。

    一般在程序中,经常调用的类,如工具类、公共跳转类等,我都会采用单例模式

    这个写法是苹果推荐的写法  这样写会在整个程序中只调用一次 也不用担心 资源抢占问题(也叫竞争冒险问题)

    +(instancetype)sharedLoadData {
      staticSingleton *singleton = nil;
      staticdispatch_once_tonceToken;// 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。


    更多请参考

    https://www.jianshu.com/p/a92c0283f243

    https://www.jianshu.com/p/e56b06ba2041

  • 相关阅读:
    sop服务治理
    调用链跟踪基本原理
    spring源码之bean的初始化及循环引用
    单调栈
    SpringBoot启动源码及自定义starter
    深入理解kafka
    Netty小结
    Oooooooooooooooooooooooooooooooooooooooooops, AN EMPTY AREA here.
    牛客OI周赛7-提高组 A 小睿睿的等式
    素数筛法求素数
  • 原文地址:https://www.cnblogs.com/isItOk/p/5218719.html
Copyright © 2011-2022 走看看