• 单例模式


              在学习的过程中一致对单例模式了解的不是很清楚,今天看到一个博主的文章,感觉略微通透了一些,在此总结一下。

              单例模式是一个类在系统中只有一个实例对象,它在整个程序的生命周期中只有一份内存,可以在多个程序中实现数据共享。

              为了避免在多线程中在多个程序中同时调用,从而导致单例中数据的不准确性。通过线程加锁,排队执行的方式(@synchronized)或者gcd的方式 -- 通过全局的一个入口点对这个实例对象进行访问(如下图)。因为如果多线程的执行时,可能不同线程同时访问单例时,在短暂的时间片的执行过程中,两个线程同时进入单例,就会就会导致线程不安全性。

             单例像一个独裁者,所有的数据访问和请求都的经过它,来确保全局只有一个对象的实例存在。学术说法是,单例模式,为某一类需求和数据提供了统一的程序接口。

             

             

            ios中单例的实现(arc模式下):

     不考虑线程安全:

    static SingleCase *manager = nil;  
        
    + (SingleCase *)defaultManager {  
        if (!manager){ 
            SingleCase = [[self alloc] init];  
            return manager; 
            }
    }

    考虑线程安全:

    //线程加锁
    +(Humen *)shared
    {
        @synchronized(self) {
            if (hm == nil) {
                hm = [[Humen alloc]init];
            }
        }
        return hm;
    }

            dispatch_once方法的作用就是执行且在整个程序的生命周期中,仅执行一次某一个block对象。 该方法是线程安全的,所以请放心大胆的在子线程中使用。(前提是你的dispatch_once_t *onceToken对象必须是全局或者静态对象。这一点很重要,如果不能保证这一点,也就不能保证该方法只会被执行一次。)

    @implementation DZSinglonARC
    +  (DZSinglonARC*) shareInstance
    {
        static DZSinglonARC* share = nil;
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            share = [[self alloc] init];
        });
        return share;
    }@end

     

  • 相关阅读:
    Ch1 机器学习基础
    信息论与编码课程设计
    实验4 数据库的安全性、完整性
    实验3 SQL语言—更新操作、视图、索引等操作
    实验2 SQL语言—SELECT查询操作
    实验1 数据库的定义和建立实验
    计算机网络|网络层作业
    信息安全从业者书单推荐
    jenkins异常 -- active (exited),无法启动
    性能测试 -- docker部署grafana
  • 原文地址:https://www.cnblogs.com/moxuexiaotong/p/4903747.html
Copyright © 2020-2023  润新知