單例模式

          在學習的過程當中一致對單例模式瞭解的不是很清楚,今天看到一個博主的文章,感受略微通透了一些,在此總結一下。ios

          單例模式是一個類在系統中只有一個實例對象,它在整個程序的生命週期中只有一分內存,能夠在多個程序中實現數據共享。安全

          爲了不在多線程中在多個程序中同時調用,從而致使單例中數據的不許確性。經過線程加鎖,排隊執行的方式(@synchronized)或者gcd的方式 -- 經過全局的一個入口點對這個實例對象進行訪問(以下圖)。由於若是多線程的執行時,可能不一樣線程同時訪問單例時,在短暫的時間片的執行過程當中,兩個線程同時進入單例,就會就會致使線程不安全性。多線程

         單例像一個獨裁者,全部的數據訪問和請求都的通過它,來確保全局只有一個對象的實例存在。學術說法是,單例模式,爲某一類需求和數據提供了統一的程序接口。學習

         

         

        ios中單例的實現(arc模式下):spa

 不考慮線程安全:線程

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

考慮線程安全:code

//線程加鎖
+(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
相關文章
相關標籤/搜索