回答
併發訪問來自多個獨立線程的對象始終在所有編程語言中呈現一致的問題集,並且Java
和Objective-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.
}
}
}
注意到它不再是一個方法修改,但所有這些仍然會做完全相同的東西,並使代碼塊線程安全,並且兩個版本基本相同。
在高層次上,兩者都可以被描述爲「確保只有一個執行線程一次執行一個代碼塊的機制」。也就是說,他們使代碼的範圍成爲原子;一次只能從一個線程執行。
雖然這使得執行線程安全,它不會使程序線程安全。原子性不保證線程安全。 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) { ... }
。
- 1. 觸發器中同步和異步復位之間的差異
- 2. 異步調用和異步io調用之間的差異.net
- 3. 瞭解同步和異步操作
- 4. 瞭解dispatch_queues和同步/異步調度
- 5. 差異同步活動ANS異步活動之間
- 6. 解釋querySelectorAll和$$之間的差異
- 7. 解釋foo和\(FOO \)之間的差異
- 8. 同步和AJAX調用之間的性能差異
- 9. JAVA和C#之間的LdapConnection差異
- 10. c#和java之間的差異寫()
- 11. Akka Scala和Java之間的差異
- 12. C#和Java之間的Base64差異
- 13. C#和java之間的輸出差異
- 14. Xor Java和Flash Actionscript之間的差異
- 15. FileWriter和BufferedWriter之間的Java差異
- 16. 瞭解POSIX和Linux/glibc sched_ *函數之間的差異
- 17. 瞭解.Net 4.6和4.6.2之間的差異/變化
- 18. 試圖瞭解git repos和vss數據庫之間的差異
- 19. 瞭解Object.create()和新SomeFunction()之間的差異
- 20. AJAX同步和異步差異
- 21. ifort和gfortran之間令人費解的性能差異
- 22. 在Java中了Runnable和可調用接口之間的差異
- 23. 差異在C和Java之間鏈表
- 24. /和/ **之間的差異
- 25. PHP之間的差異()和[]
- 26. '//'和'///'之間的C++差異
- 27. VBA:&和+之間的差異
- 28. 之間的差異和::: ++
- 29. Java SE與Java EE之間的差異
- 30. Async和Beginnet異步API之間的差異