了解Java和Objective-c synchronized指令之间的差异
什么是同步的 它是用来干什么的了解Java和Objective-c synchronized指令之间的差异,java,objective-c,synchronized,Java,Objective C,Synchronized,什么是同步的 它是用来干什么的 javasynchronized与objective-c@synchronized之间有什么区别?从多个独立线程并发访问一个对象始终会在所有编程语言中出现一组一致的问题,java和objective-c也不例外。为了帮助解决这些问题,两种语言都支持所谓的synchronized指令。标记有synchronized指令的任何代码块都会受到保护,以防在任何时候有多个线程执行它 Synchronized用于使代码块线程安全。它使得在任何给定时间只有一个线程可以执行该代码
java
synchronized
与objective-c@synchronized
之间有什么区别?从多个独立线程并发访问一个对象始终会在所有编程语言中出现一组一致的问题,java
和objective-c
也不例外。为了帮助解决这些问题,两种语言都支持所谓的synchronized
指令。标记有synchronized
指令的任何代码块都会受到保护,以防在任何时候有多个线程执行它
Synchronized
用于使代码块线程安全。它使得在任何给定时间只有一个线程可以执行该代码块
实际上,这两种语言之间以及它们如何使用synchronized
指令之间没有太多差异。唯一的主要区别是在Java
中,synchronized
实际上是一个关键字
,可以用作方法修饰符。而要在Objective-C
中实现等效,您必须在方法的最外层代码块上使用@synchronized(self)
。除了这些小限制之外,您还可以在Objective-C
中使用与java中的synchronized
完全相同的方式进行@synchronized
。要说明这些细微差别并说明如何使用synchronized
保存代码线程,请参见下面的示例
Java
public class MyThreadSafeExample {
public synchronized void safeMethod() {
// Here you would enter the code you want to be thread safe.
}
}
目标-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.
}
}
}
请注意,它不再是一个方法修饰符,但它们都会做完全相同的事情,并使代码块线程安全,而且两个Java版本基本相同。从多个独立线程并发访问一个对象始终会在所有编程中出现一组一致的问题语言和
Java
和Objective-C
也不例外。为了帮助解决这些问题,两种语言都支持所谓的synchronized
指令。标记有synchronized
指令的任何代码块都会受到保护,以防在任何时候有多个线程执行它
Synchronized
用于使代码块线程安全。它使得在任何给定时间只有一个线程可以执行该代码块
实际上,这两种语言之间以及它们如何使用synchronized
指令之间没有太多差异。唯一的主要区别是在Java
中,synchronized
实际上是一个关键字
,可以用作方法修饰符。而要在Objective-C
中实现等效,您必须在方法的最外层代码块上使用@synchronized(self)
。除了这些小限制之外,您还可以在Objective-C
中使用与java中的synchronized
完全相同的方式进行@synchronized
。要说明这些细微差别并说明如何使用synchronized
保存代码线程,请参见下面的示例
Java
public class MyThreadSafeExample {
public synchronized void safeMethod() {
// Here you would enter the code you want to be thread safe.
}
}
目标-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.
}
}
}
请注意,它不再是一个方法修饰符,但它们都会做完全相同的事情,并使代码块线程安全,而且两个Java版本基本相同。在高层,这两个版本都可以描述为“确保一次只执行一个线程执行一个代码块的机制”. 也就是说,它们使代码的范围成为原子的;一次只能从单个线程执行 虽然这使执行线程安全,但并不使程序线程安全。原子性不能保证线程安全 注意:它们几乎是一样的,这并不奇怪。Java是作为Objective-C的直接派生而创建的 一个区别是:在Java中,应用于方法的
synchronized
关键字会影响该类在任何一个实例上的所有方法。不能让一组方法在状态A
上同步,而另一组方法在状态B
上同步。Objective-C没有这个表单
Objective-C和Java还具有@synchonized(ARG){…}
(Java丢弃@
)构造,通过在所述作用域的执行期间按住{…}
上的锁来序列化作用域(其中所述作用域的第二次执行将同时阻塞,直到完成)
因此,您可以在任何一个类内,甚至跨多个类拥有许多不同的序列化网关
例如,如果您有一个具有可变数组实例变量的类,则可以:
- (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){…}
,这两种机制都可以描述为“确保一次只有一个执行线程执行一块代码的机制”。也就是说,它们使代码的范围成为原子的;仅可从单个线程执行