我有一组方法,它们全部同步到类对象(不能使用 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
毛里西奥的评论是正确的。从TOCPL http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocThreading.html:
Objective-C 同步功能支持递归和可重入代码。一个线程可以以递归的方式多次使用单个信号量;其他线程将被阻止使用它,直到该线程释放通过它获得的所有锁;也就是说,每一个@synchronized()
块正常退出或通过异常退出。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)