美文网首页终端研发部
iOS用dispath_once 和@synchronized创

iOS用dispath_once 和@synchronized创

作者: iamgaoshuai | 来源:发表于2017-11-11 17:20 被阅读27次

@synchronized 的优点

  • 使用dispath_once 创建单例 如果对象销毁就不能重新创建 使用@synchronized则可以避免这种情况的发生
  • 使用block而非函数指针这样代码更加自然

@synchronized 的弊端

  • 这样性能不是很好,因为每次调用都会付出取锁的代价
+ (id)sharedInstance
{
    static Instance *obj = nil;
    @synchronized([Instance class])
    {
        if(!obj)
            obj = [[Instance alloc] init];
    }
    return obj;
}

dispath_once的优点

  • 性能上比@synchronized高一些
  • 满足了线程安全的问题
  • 它可以保证block中的代码在任何线程通过dispatch_once调用之前被执行,但它不会强制每次调用这个函数都让代码进行同步控制。实际上,如果你去看这个函数所在的头文件,你会发现目前它的实现其实是一个宏,进行了内联的初始化测试,这意味着通常情况下,你不用付出函数调用的负载代价,并且会有更少的同步控制负载
+ (id)sharedInstance
{
    static dispatch_once_t pred;
    static Instance *obj = nil;
    dispatch_once(&pred, ^{
        obj = [[Instance alloc] init];
    });
    return obj;
}

相关文章

网友评论

    本文标题:iOS用dispath_once 和@synchronized创

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