Bas*_*CAD 6 multithreading mutex objective-c synchronized ios
我知道@synchronized()的作用,但......
有时我们有:
1- @synchronized(self)
2- @synchronized([MyClass class])
3-@synchrinized(myObj)
有什么区别,我应该传递给这个块的参数是什么?
Mar*_*n R 10
从文档:
传递给
@synchronized指令的对象是用于区分受保护块的唯一标识符.如果在两个不同的线程中执行上述方法,则anObj在每个线程上为参数传递一个不同的对象,每个线程都会锁定并继续处理而不会被另一个阻塞.但是,如果在两种情况下都传递相同的对象,则其中一个线程将首先获取锁定,另一个线程将阻塞,直到第一个线程完成关键部分.
因此,它取决于您希望保护的内容不会同时执行,并且所有三种情况都有应用程序.
例如,在
-(void)addToMyArray1:(id)obj
{
@synchronized(self) {
[self.myArray1 addObject:obj];
}
}
-(void)addToMyArray2:(id)obj
{
@synchronized(self) {
[self.myArray2 addObject:obj];
}
}
Run Code Online (Sandbox Code Playgroud)
两个@synchronized块不能同时在同一个实例(self)上调用该方法的两个线程执行,从而保护从不同线程同时访问阵列.
但它也阻止第一种方法的块与第二种方法的块同时执行,因为它们使用相同的锁self.因此,对于更精细的锁定,您可以使用不同的锁:
-(void)addToMyArray1:(id)obj
{
@synchronized(self.myArray1) {
[self.myArray1 addObject:obj];
}
}
-(void)addToMyArray2:(id)obj
{
@synchronized(self.myArray2) {
[self.myArray2 addObject:obj];
}
}
Run Code Online (Sandbox Code Playgroud)
我们同时访问self.myArray1,并self.myArray2从不同的线程仍然受到保护,但互不影响.
类上的锁可用于保护对全局变量的访问.这只是用于演示目的的一个简单示例:
static int numberOfInstances = 0;
-(id)init
{
self = [super init];
if (self) {
@synchronized([self class]) {
numberOfInstances++;
}
}
}
Run Code Online (Sandbox Code Playgroud)