2013-08-16 60 views

回答

5

併發訪問來自多個獨立線程的對象始終在所有編程語言中呈現一致的問題集,並且JavaObjective-C也不例外。爲了幫助解決這些問題,兩種語言都支持所謂的​​指令。用​​指令標記的任何代碼塊都受到保護,以防止在任何時候多於一個線程執行它。

Synchronized用於使代碼塊線程安全。它使得只有一個線程可以在任何時候執行該代碼塊。

這兩種語言之間並沒有太多的區別,他們如何使用​​指令。唯一的主要區別是在Java,​​實際上是一個keyword並且可以用作方法修飾符。鑑於要完成Objective-C中的等效項,您必須在方法的最外面的代碼塊上使用@synchronized(self)。除了這些小的限制之外,您可以使用@synchronized中的Objective-C,其方式與您在java中的​​完全相同。爲了說明這些細微差別,並說明如何使用​​來保存代碼,請參閱下面的示例。

的Java

public class MyThreadSafeExample { 
    public synchronized void safeMethod() { 
     // Here you would enter the code you want to be thread safe. 
    } 
} 

Objective-C的

@interface MyThreadSafeExample : NSObject 

- (void)safeMethod; 

@end 

@implementation MyThreadSafeExample 

- (void)safeMethod 
{ 
    @synchronized(self) { 
     // Here you would enter the code you want to be thread safe. 
    } 
} 

@end 

注意,除了明顯的語法差異沒有兩個和這兩個之間的巨大差異將採取行動完全一樣。

還要注意,在的Java你可以使它看起來更像Objective-C的執行以下

public class MyThreadSafeExample { 
    public void safeMethod() { 
     synchronized (this) { 
      // Here you would enter the code you want to be thread safe. 
     } 
    } 
} 

注意到它不再是一個方法修改,但所有這些仍然會做完全相同的東西,並使代碼塊線程安全,並且兩個版本基本相同。

5

在高層次上,兩者都可以被描述爲「確保只有一個執行線程一次執行一個代碼塊的機制」。也就是說,他們使代碼的範圍成爲原子;一次只能從一個線程執行。

雖然這使得執行線程安全,它不會使程序線程安全。原子性不保證線程安全。 What's the difference between the atomic and nonatomic attributes?

注意:它們幾乎相同應該不會令人意外。 Java是作爲Objective-C的直接派生而創建的。

一個區別:在Java中,應用於方法的​​關鍵字會影響任何一個實例上該類的所有方法。您不能讓一組方法在狀態A上同步,而另一組方法在狀態B上同步。 Objective-C沒有這種形式。

兩個Objective-C和Java也具有@synchonized(ARG) { ... }(爪哇丟棄@)構建體通過保持所述範圍的執行期間鍵控上ARG鎖(序列化範圍{ ... }其中所述範圍同時將阻塞,直到處理完畢的第二執行)。

因此,您可以在任何一個類中或甚至跨類中有許多不同的序列化網關。

舉例來說,如果你有一類具有可變數組實例變量,你可以:

- (void)swap { 
    @synchonized(_mutableArray) { 
      ... swap some elements here ... 
    } 
} 

- (void)sort { 
    @synchonized(_mutableArray) { 
      ... sort some elements here ... 
    } 
} 

而且你可以在方法中混合@synchronized()範圍:

- (void)thisIsntAGoodIdeaButJustAnExample 
    @synchonized(_mutableArray) { 
      ... sort some elements here ... 
      @synchronized(self) { 
       ... some operation that requires both _mutableArray and self to be locked ... 
      } 
    } 
} 

您還可以使用@synchronized([SomeClass class]) { ... }@synchronized(someGlobal) { ... }