IOS開發之關鍵字synchronized

來源:互聯網
上載者:User

static Config * instance =
nil;

+(Config *) Instance {

    @synchronized(self)  {

        if(nil ==
instance)  {

            [self new];

        }

    }

    return
instance;

}

+(id)allocWithZone:(NSZone *)zone {

    @synchronized(self)  {

        if(instance ==
nil){

            instance = [super
allocWithZone:zone];

            return instance;

        }

    }

    return nil;

}

在上面兩個例子中都用到 關鍵字@synchronized,這裡大概說一下

  @synchronized,代表這個方法加鎖, 相當於不管哪一個線程(例如線程A),運行到這個方法時,都要檢查有沒有其它線程例如B正在用這個方法,有的話要等正在使用synchronized方法的線程B運行完這個方法後再運行此線程A,沒有的話,直接運行。它包括兩種用法:synchronized 方法和 synchronized 塊。@synchronized 方法控制對類(一般在IOS中用在單例中)的訪問:每個類執行個體對應一把鎖,每個 synchronized 方法都必須獲得調用該方法鎖方能執行,否則所屬就會發生線程阻塞,方法一旦執行,就獨佔該鎖,直到從該方法返回時才將鎖釋放,此後被阻塞的線程方能獲得該鎖,重新進入可執行狀態。這種機制確保了同一時刻對於每一個類,至多隻有一個處於可執行狀態,從而有效避免了類成員變數的存取違規(只要所有可能訪問類的方法均被聲明為
synchronized)。

synchronized 塊:

  @通過 synchronized關鍵字來聲明synchronized 塊。文法如下:

  @synchronized(syncObject) { }

  synchronized 塊是這樣一個代碼塊,其中的代碼必須獲得對象 syncObject (如前所述,可以是類執行個體或類)的鎖方能執行,具體機制同前所述。由於可以針對任意代碼塊,且可任意指定上鎖的對象,故靈活性較高。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.