繁体   English   中英

对可能被objective-c中的另一个线程锁定的对象进行“脏读”的最佳方法

[英]Best way to do a “dirty read” of an object that may be locked by another thread in objective-c

我想知道以下是否是读取和复制可能被另一个线程锁定的对象的最佳方法?

-(NSObject*) getCopyOfActiveObjectsOfType:(Class) objectClass
{
    NSMutableArray* copy = [NSMutableArray arrayWithArray:[self.activeObjects objectForKey:objectClass]];

    return copy;
}

我有几种类似下面的方法,可以锁定有问题的对象以将对象添加或删除到数组中。

-(void) addObject:(NSObject *)object toPoolOfObjects:(NSMutableDictionary*) objects
{
    Class objectClass = [object class];
    @synchronized (objects)
    {
        NSMutableArray* objectArray = [objects objectForKey:objectClass];

        if(objectArray == nil)
        {
            objectArray = [[[NSMutableArray alloc] init] autorelease];
            [objects setObject:objectArray forKey:objectClass];
        }
        [objectArray addObject:object];
    }

}

使用@synchronize方法或其他替代语言的等效方法:

  • 如果您的实例是从多个线程访问的,并且它不是不可变的 ,则您将需要所有访问状态都可以改变的方法周围的同步块
    • 如果没有访问器/方法更改对象的内部状态,则您的对象是不可变的。

您正在使用标准的NSMutableArray / NSMutableDictionary原语进行状态处理,但是它们不是线程安全的,因此在线程间共享时需要锁。 如果不知道您的API及其使用者的访问频率与更新频率,就很难推荐一种特定的解决方案。

如果您的API主要是读取的,则可以采用以下解决方案,该解决方案在写入时实现了复制。 尽管与往常一样,您必须进行概要分析以确定解决方案是否满足您的性能要求。

- (NSArray *)getActiveObjectsOfType:(Class)objectClass {
    @synchronize(self.activeObjects) {
        return [self.activeObjects objectForKey:objectClass];
    }
}

- (void)addObject:(NSObject *)object {
    Class objectClass = [object class];

    // synchronize access to activeObjects
    @synchronize(self.activeObjects) {
        NSArray *existingArray = [[[self.activeObjects objectForKey:objectClass] retain] autorelease];

        NSMutableArray *newArray;
        if (existingArray) {
            newArray = [NSMutableArray arrayWithArray:existingArray];
        } else {
            newArray = [NSMutableArray array];
        }

        [newArray addObject:object];

        [self.activeObjects setObject:newArray forKey:objectClass];
    }
}

此解决方案要注意的重要一点是,getActiveObjectsOfType返回的NSArray是不可变的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM