2012-02-15 72 views
0

當我希望數據結構一次只能被一個線程讀取或寫入時,我真的很喜歡@ synchronized-construct而不是使用NSLocks。但是,當我想要更改整個對象時,我不能確定@synchronized是否合適。我想知道的,是這些工作是否以同樣的方式:Objective-C @synchronized object changes

// version 1: 

// segment 1: 
@synchronized(self.obj) { 
    self.obj = obj2; 
} 
// segment 2: 
@synchronized(self.obj) { 
    // some other stuff 
} 

// version 2: 
// segment 1: 
[objLock lock]; 
self.obj = obj2; 
[objLock unlock]; 
// segment 2: 
[objLock lock]; 
// some other stuff 
[objLock unlock]; 
+0

[更改鎖定對象insde @synchronized部]的可能重複(http://stackoverflow.com/questions/1215765/changing-the-locking-object-insde -synchronized截面) – kennytm 2012-02-15 11:02:18

回答

0

一個NSLock@synchronized通話基本上是同樣的事情,是幾乎可以互換。有一些細微的差異,你可能不需要關心這樣一個簡單的實現 - 但是請仔細閱讀它們,因爲它很有趣!

有一個很好的SO回答這裏兩個比較:How does @synchronized lock/unlock in Objective-C?

1

相反,你可以設置一個屬性,而不nonatomicnonatomic的缺席意味着它是atomic

屬性是默認的原子,使合成的訪問器提供強大的訪問特性在多線程環境,也就是說,通過制定者從getter返回或設置的值總是完全檢索或設置無論什麼其他線程正在同時執行。

有關詳情,請參閱Apple documentation