单例模式

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

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

          为了避免在多线程中在多个程序中同时调用,从而导致单例中数据的不准确性。通过线程加锁,排队执行的方式(@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

 

原文地址:https://www.cnblogs.com/moxuexiaotong/p/4903747.html