Double @synchronized:它需要吗?

时间:2013-04-03 09:02:07

标签: ios objective-c synchronization

我正在使用最新的SDK开发iOS应用程序。

我的应用程序是来自Android应用程序的端口,我有以下两种方法:

- (MyObject*)getMyObject:(MyObjectType)myObjectType
{
    @synchronized(self)
    {
        for (int index = 0; index < [myObjects count]; index++)
        {
            MyObject* myObject = (MyObject*)[myObjects objectAtIndex:index];
            if (myObject.Type == myObjectType)
                return myObject;
        }

        return nil;
    }
}

- (BOOL)isMyObjectVisible:(MyObjectType)myObjectType
{
    @synchronized(self)
    {
        return ([self getMyObject:myObjectType] != nil);
    }
}

我有isMyObjectVisible:,即@synchronized,正在调用另一个@synchronized方法。

isMyObjectVisible:是否必须@synchronized

2 个答案:

答案 0 :(得分:1)

要回答您的第一个问题,,则不需要双重锁定。

您可以锁定getMyObject。这可以保护它。但是,isMyObjectVisible除了调用getMyObject之外没有任何内容,因此在该方法中没有任何 else 可以保护。

然而,borrrden的评论在这里不是问题。您在recursive lock时获得using @synchronized,因此您可以像没有死锁一样嵌套synchronized次呼叫。在你的情况下,没有需要

答案 1 :(得分:1)

以下是您需要使用double @synchronized:

的示例
NSString * str;
str = [[NSString alloc] initWithFormat:@"str"];

-(void)viewDidLoad{

  NSString *foo = @"foo";
  NSString *bar = @"bar";
  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
  [self firstAction:foo];
  });
  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
  [self secondAction:bar];
  });
}
- (void)firstAction:(NSString *)sender {
    NSLog(@"firstAction");
    @synchronized (self) {
        str = sender;
        for (int i=0; i<5; i++) {
            NSLog(@"first: %@",str);
        }
    }
}

- (void)secondAction:(NSString *)sender {
        NSLog(@"secondAction");
        @synchronized (self) {
            str = sender;
            for (int i=0; i<5; i++) {
                NSLog(@"second: %@",str);
            }
        }  
 }

(str是静态变量) - 尝试在没有@synchronized(self)的情况下运行它,看看会发生什么。