我知道@synchronized()的作用,但是......
有时我们有:
1- @synchronized(self)
2- @synchronized([MyClass class])
3- @synchrinized(myObj)
什么是差异,我应该传递给这个块的参数是什么?
答案 0 :(得分:10)
传递给
@synchronized
指令的对象是唯一的 用于区分受保护块的标识符。如果你执行 在两个不同的线程中传递一个不同的对象 对于每个线程上的anObj
参数,每个线程都会锁定它 继续处理而不被另一方阻止。如果你通过 然而,在两种情况下都是相同的对象,其中一个线程会 首先获得锁定,另一个锁定直到第一个 线程完成了关键部分。
所以这取决于你想要保护什么不被同时执行, 这三种情况都有申请。
例如,在
中-(void)addToMyArray1:(id)obj
{
@synchronized(self) {
[self.myArray1 addObject:obj];
}
}
-(void)addToMyArray2:(id)obj
{
@synchronized(self) {
[self.myArray2 addObject:obj];
}
}
两个@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];
}
}
现在可以从不同的线程同时访问self.myArray1
和self.myArray2
仍然受到保护,但彼此独立。
类上的锁可用于保护对全局变量的访问。 这只是用于演示目的的一个简单示例:
static int numberOfInstances = 0;
-(id)init
{
self = [super init];
if (self) {
@synchronized([self class]) {
numberOfInstances++;
}
}
}
答案 1 :(得分:-1)
@synchronized应该每次都传递相同的对象。所以@synchronized(self)会效果最好。