关于锁的困惑

时间:2011-11-11 08:34:19

标签: ios multithreading synchronization nsmutablearray mutex

在锁定方面,有一点我不确定。我读过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是线程安全的?

由于

1 个答案:

答案 0 :(得分:3)

@synchronized的“参数”是所谓的标记或密钥,因此您可以拥有不同的锁定部分。当他们拥有相同的令牌时,他们只会互相阻止。对象本身并未“锁定”。

因此,如果您有两个@synchronized(foo)和两个@synchronized(bar),则 foo 部分会相互阻止,但不会阻止 bar 部分。< / p>

如果可能,由于其动态特性,您应该avoid @synchronized as it's very slow