我有一组方法,它们都与类对象同步(不能使用self,因为这个对象的多个实例可以在多个线程中使用)。其中一些方法调用类中的其他方法,这些方法也在类对象上同步。不知何故,这是可行的,并不会导致我期望的死锁。
我假设testA将被阻止运行,因为testB已经锁定了类对象,但显然并非如此。
这是@synchronized正在做的特殊事情,还是底层互斥锁的一个特性?
工作的示例代码:
- (NSUInteger)testA
{
@synchronized(self.class)
{
NSLog(@"Doing something in A");
}
return 1;
}
- (void)testB
{
@synchronized(self.class)
{
NSLog(@"Doing something in B");
NSLog(@"A returned: %i", [self testA]);
}
}当调用testB时,输出如下:
Doing something in B
Doing something in A
A returned: 1发布于 2012-01-21 21:37:40
Mauricio的评论是正确的。来自TOCPL
Objective同步特性支持递归和重入代码。一个线程可以以递归的方式多次使用单个信号量;在线程释放它获得的所有锁之前,其他线程将被阻止使用它;也就是说,每个
@synchronized()块都正常退出或通过异常退出。
https://stackoverflow.com/questions/8956857
复制相似问题