2011-11-11 263 views
0

有一件事我不確定何時涉及到鎖。我讀過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

相關:[是@synchronized塊保證釋放他們的鎖嗎?](http://stackoverflow.com/q/7735799/557219)凱文的答案也應該回答你的問題:只要是同一個互斥體被「m_myMutableArray」指向的對象是相同的。 – 2011-11-11 08:37:57

+0

可能的重複[如何在Objective-C中執行@synchronized lock/unlock?](http://stackoverflow.com/questions/1215330/how-does-synchronized-lock-unlock-in-objective-c) – 2011-11-11 08:42:38

+0

每次我要訪問m_myMutablearray時,還必須使用@synchronized指令?例如,如果threadB沒有使用synchronized指令,如果之前threadA鎖定它,它仍會阻塞嗎? – KaiserJohaan

回答

3

的「論據」,以@synchronized是所謂令牌或按鍵讓您可以有不同的鎖定部分。當他們擁有相同的標記時,他們只會相互阻塞。對象本身不被「鎖定」。

所以,如果你有兩個@synchronized(foo)和兩個@synchronized(bar),該部分阻止對方,但不會阻止酒吧部分。

如果可能,你應該avoid @synchronized as it's very slow,由於其動態性質。

+0

如果threadA是主線程,我可以使用performSelectorOnMainThread處理threadB中的所有干擾操作嗎? – KaiserJohaan

+0

你是說,爲了避免完全鎖定?取決於你想做什麼,這是一個選項。但是請注意,如果設置了* waitUntilDone:YES *,則threadB將阻塞,直到main完成當前運行循環迭代,然後才能執行選擇器。大部分時間比鎖定慢。 – DarkDust

+0

如果我不等待使用完畢(它是更新像ListView這樣的UI元素的回調)是否是一個好的解決方案? – KaiserJohaan