2010-06-07 87 views
5

由於內存模型,我意識到在java中雙重檢查鎖定存在缺陷,但通常與單例模式相關聯並優化單例的創建。雙重鎖定 - 目標c

怎麼樣在這種情況下,在Objective-C:

我有一個布爾標誌,以確定是否我的應用程序是流數據或沒有。我有3種方法,startStreaming,stopStreaming,streamingDataReceived我使用保護他們從多個線程:

- (void) streamingDataReceived:(StreamingData *)streamingData { 
    if (self.isStreaming) { 
     @synchronized(self) { 
      if (self.isStreaming) { 

- (void) stopStreaming { 
    if (self.isStreaming) { 
     @synchronized(self) { 
      if (self.isStreaming) { 

- (void) startStreaming:(NSArray *)watchlistInstrumentData { 
    if (!self.isStreaming) { 
     @synchronized(self) { 
      if (!self.isStreaming) { 

這是雙重檢查uneccessary? objective-c中的雙重檢查是否與java中的問題類似?這種模式有哪些替代方案(反模式)。

感謝

回答

2

同樣,也有缺陷 - 你有一個競爭條件

您必須輸入您的同步部分,然後檢查該標誌

+0

你能證明這個答案嗎? – 2012-07-26 13:23:39

+0

您可以擴展答案以添加替代方案的建議。例如,Objective-C中是否存在與「transient」或AtomicInteger /等同等的內容? – 2013-07-03 13:00:21

0

這看起來像過早優化我。怎麼了(例如)

- (void) startStreaming:(NSArray *)watchlistInstrumentData { 
     @synchronized(self) { 
      if (!self.isStreaming) { 
... 
+0

如果沒有必要,我避免了輸入同步塊的代價。 – bandejapaisa 2010-06-28 15:34:31

+0

這就是我所說的「過早優化」。爲什麼你會關心進入同步塊的成本,除非你使用profiler來測量它,並且花費了大量的時間? – JeremyP 2010-06-30 07:38:54