单例在多线程中的使用

一次执行  dispatch_once: 对应的代码只执行一次 , 并且它是线程安全的, 系统会自动这个函数加锁,保存同一时间只有一个线程去执行任务, 实现真正意义的一次性执行

 

什么时候需要用到一次性执行:  单例

单例:

就是在程序运行期间,只有一个实例化对象  ----

    举例:音乐播放器的App, 同时只能播放一首歌曲.

    好处: 如果不使用同一个播放管理器对象, 那就播放下一首歌曲时, 先销毁上一个对象, 再创建一个新对象

            这样做就比较消耗资源.

         既然同一个时刻只能播放一首歌曲 ,所以我们只要一个播放管理者实例就可以了, 当播放下一首歌曲的时候,直接用这个对象把上一首歌移除, 播放这一首就可以了.

 

static id _instance;
//单例的实现
+ (instancetype)sharedMusicManager{
    if (_instance){
        return _instance;
    }
    _instance = [[self alloc] init];
    return _instance;
    
}

//[alloc] init 方法会调用 allocWithZone
+ (instancetype)allocWithZone:(struct _NSZone *)zone{
    static dispatch_once_t onceToken;
    //系统提供的, 官方建议实现单例就用这种方式
    //dispatch_once 这个方法是线程安全
    dispatch_once(&onceToken, ^{
        _instance = [super allocWithZone:zone];
    });
    return _instance;
}

 

转载于:https://www.cnblogs.com/thinkToShare/p/5642109.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值