在锁定方面,有一点我不确定。我读过http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/ThreadSafety/ThreadSafety.html#//apple_ref/doc/uid/10000057i-CH8-SW16,但有一点我不确定; @synchronize(或者只是一般的互斥)只保护一段代码(比如在方法中)或整个锁定整个对象?
例如,两个线程处理这些方法,修改数组;
@synthesize m_myMutableArray;
-(void)threadA
{
@synchronized(m_myMutableArray) {
[m_myMutableArray removeAllObjects];
}
}
-(void)threadB
{
NSInteger asdf = 1;
@synchronized(m_myMutableArray) {
[m_myMutableArray addObject:asdf];
}
@synchronized不执行任何操作,因为它们是两个独立的代码块,或者两个方法中是否锁定了相同的互斥锁,这意味着m_myMutableArray是线程安全的?
由于
答案 0 :(得分:3)
@synchronized
的“参数”是所谓的标记或密钥,因此您可以拥有不同的锁定部分。当他们拥有相同的令牌时,他们只会互相阻止。对象本身并未“锁定”。
因此,如果您有两个@synchronized(foo)
和两个@synchronized(bar)
,则 foo 部分会相互阻止,但不会阻止 bar 部分。< / p>
如果可能,由于其动态特性,您应该avoid @synchronized
as it's very slow。