什么是synchronized
?
它的用途是什么?
java synchronized
和 objective-c @synchronized
有什么区别?
从多个独立线程并发访问对象在所有编程语言中始终存在一组一致的问题,Java
和Objective-C
也不例外。为了帮助解决这些问题,两种语言都支持所谓的synchronized
指令。任何标有 synchronized
指令的代码块都受到保护,防止多个线程在任何时候执行它。
Synchronized
用于使代码线程块安全。它使得只有一个线程可以在任何给定时间执行该代码块。
这两种语言之间实际上没有太多区别,以及它们如何使用synchronized
指令。唯一的主要区别是,在Java
中,synchronized
实际上是一个keyword
,可以用作方法修饰符。而要在Objective-C
中完成等效,您必须在方法中最外层的代码块上使用@synchronized(self)
。除了这些小限制之外,您还可以以与在 Java 中synchronized
完全相同的方式@synchronized
Objective-C
。为了说明这些细微差异并演示如何使用synchronized
保存代码线程,请参阅下面的示例。
爪哇岛
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删除@
(构造通过在执行所述作用域期间按住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) { ... }
.