2012-02-15 4 views
0

Я действительно люблю @ synchronized-construct вместо использования NSLocks, когда хочу, чтобы структура данных считывалась или записывалась только одним потоком за раз. Однако, когда я хочу изменить весь объект, мы @synchronizing on, я не уверен, подходит ли @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

ответ

0

NSLock и @synchronized вызов в основном то же самое, и в значительной степени взаимозаменяемыми. Есть несколько незначительных отличий, которые вам, вероятно, не нужно заботиться о такой простой реализации, но читайте их, потому что это интересно!

Там хороший SO ответ здесь сравнивает два: How does @synchronized lock/unlock in Objective-C?

1

Вместо этого вы можете установить свойство без nonatomic. Отсутствие nonatomic означает, что это atomic.

Свойство атомарно по умолчанию, так что синтезированные аксессоры обеспечивают надежный доступ к свойствам в многопоточной среде, то есть, значение, возвращаемое из геттера или установить с помощью инкубатора всегда полностью извлеченной или установить независимо от того, каких других потоков выполняются одновременно.

Для получения дополнительной информации см Apple documentation