我正在設計一個Objective-C中的單例類,它將被多個線程訪問。在我班有3-4 NSMutableArray
,外班有閱讀,增加和刪除操作,這當然包裝在這個類中。在可變數組訪問中普遍使用@synchronized指令的替代方法
由於NSMutableArray
不是線程安全的,我使用@synchronized()
使我的操作線程安全,但它會導致使用@synchronized()
塊過多。
因爲對於每個3-4陣列我至少有1個添加功能,1個刪除功能和5次我需要讀取值。所以,對於1個陣列,我至少使用了7個@synchronized()
塊。 對於4個陣列,我需要在我的單例類中添加28個@synchronized
塊。
有沒有更好的方法來解決我的問題? 或者,如果我確實使用了所有這些@synchronized
指令,是否會導致問題?
我知道如果我想讓我的對象線程安全,它會減慢我的代碼,但除此之外,還有什麼缺點?
1)如果你的單例是線程安全的,那麼你可能不需要擔心它的數據成員_NSMutableArray_在你的情況。 2)您一定聽說過並使用過數據成員的_atomic/nonatomic_屬性。前者使他們線程安全。爲了額外的安全性,你可以聲明你的_NSMutableArrays_是原子的。 – Adeel
另一種方法是爲每個陣列創建一個串行調度隊列。然後,您可以將數組更新同步分派到陣列更新方法中的相關隊列中。 @Adeel,使一個NSMutable數組屬性原子不會使底層數組線程安全,只是屬性本身。 – Paulw11
@Adeel:對一個可變對象類型的屬性使用原子屬性確實不會同步變量。它不會使其「線程安全」。它只做一件事,一件事:確保吸氣劑和二道濾器不被打斷。對象之後發生的事情不受控制。 –