2012-12-12 30 views
1

可能重複:
What does @synchronized() do?@synchronized鎖定iVar和/或財產?

我有什麼@synchronized確實,什麼將是最適合我的應用程序的問題。

我有一個NSMutableArray,我將在後臺線程中進行變異並在前臺線程中進行訪問。如果在我改變它的內容的時候訪問數組,如果它意味着我可以從背景突變中獲取更新後的值,我很樂意輕鬆地訪問數組。然而,我不能100%確定NSLock s和@synchronized是如何工作的。

如果這是不可能的,是否有可能改變數組的副本,當完成時,鎖定屬性/實例變量時設置它的副本的內容,以凍結任何訪問者調用?

基本上,@synchronized(myArray)會凍結任何訪問者調用(讓這個調用掛起,直到鎖放棄然後執行)?

此外,是否有可能鎖定實例變量或屬性與NSLock?從我所看到的,它似乎只鎖定代碼塊。

+1

調查Grand Central Dispatch ...這是一種更好的方式來執行多線程陣列邏輯。 – borrrden

+0

@borrrden謝謝!這實際上是我目前如何處理多層邏輯。希望其他人也可以看到使用它。這很棒。 – RileyE

回答

1
Basically, will the @synchronized(myArray) freeze any accessor calls (have the call hang 
until the lock lets up and then execute)? 

不,但它會凍結您的訪問器,如果在調用任何訪問器之前,您使用數組實例上的synchronized指令。
如果線程1進入陣列實例上的同步塊,並且線程2嘗試進入同一個數組上的同步塊,則必須等待線程1退出塊。但如果使用synchronized指令在不同的對象上,那麼多個線程可以進入synchronized塊。

+0

好的。謝謝!爲了線程安全,我不得不想出一種鎖定setter和getters的自定義方式,但它似乎工作得很好。謝謝! – RileyE

+0

我建議不要鎖定setter/getter,而是要鎖定調用該方法的塊。 –

+0

問題在於它來自單例,所以多個類調用setters和getters。 – RileyE