2011-10-25 59 views
7

從Java編輯我想學習Objective-C的線程安全。到目前爲止,我已經湊近那個同時使用@synchronized,volatile和OSMemoryBarrier()。一個人暗示另一個人嗎?

  • @Synchronized塊防止相同的代碼塊的併發訪問
  • volatile變量保證翻過螺紋
  • OSMemoryBarrier變化的可見性();確保訪問的正確順序

我的問題是:其中一個暗示其他一個或多個?如果我想要所有三種,我是否需要使用所有三種技術?

實施例:

volatile int first = 0; 
volatile int second = 0; 

[...] 

@synchronized { 
    OSMemoryBarrier(); 
    first++; 
    OSMemoryBarrier(); 
    second++; 
    OSMemoryBarrier(); 
} 

在Java所有三個進入和離開同步塊時和讀取或寫入的易失性可變時放心。真正?

回答

1

的@Synchronized指令被轉換如下...

- (NSString *)myString { 
    @synchronized(self) { 
    return [[myString retain] autorelease]; 
    } 
} 

變得...

- (NSString *)myString { 
    NSString *retval = nil; 
    pthread_mutex_t *self_mutex = LOOK_UP_MUTEX(self); 
    pthread_mutex_lock(self_mutex); 
    retval = [[myString retain] autorelease]; 
    pthread_mutex_unlock(self_mutex); 
    return retval; 
} 
+0

所以進入和離開同步塊構成的存儲器障礙的通過?如果對一個變量的訪問受到一個同步塊的保護,變量不需要變化,因爲變更對其他線程始終可見? – Twilite

+0

我發現了更多的揮發性這個問題的答案:http://stackoverflow.com/questions/6866206/volatile-and-createthread看來,波動不會造成內存屏障,是無用的線程之間的訪問同步。 – Twilite

0

@Synchronized不保護的代碼塊被重新輸入 - 它可以防止執行任何代碼也使用與同一個對象@synchronized。所以,如果你有兩個方法

- (void)method1 { 
    @synchronized (self) { dothis(); } 
} 
- (void)method2 { 
    @synchronized (self) { dothat(); } 
} 

和兩個不同的線程調用同一對象方法1和method2,然後dothis(),並找時間做()被稱爲一前一後。當然,如果兩個不同的線程爲同一個對象調用method1,情況也是如此。 @Synchronized不從同一線程上輸入塊雖然阻止你,所以在)以上dothis的例子(可以稱之爲[自方法2],它不會被阻止。

如果使用揮發性或OSMemoryBarrier(),那麼我建議你的設計是很多,很多,很多太複雜,你會遇到麻煩遲早的事。

相關問題