我正在为iPhone编写一个多线程应用程序,并且我正在使用NSLock来确保某些操作(比如从文件中加载声音)将表现为原子操作。为了简化从应用程序的不同部分获取锁的过程,我编写了以下类,它允许我通过传递NSString和name来锁定和解锁锁。如果这样的锁不存在,它会创建它并保存以备将来使用。我测试了它,它似乎工作得很好(因为它只提供对NSLock对象的访问,而不会改变它们的行为)。
我的问题是:拥有和使用这样的类可以吗,或者我对锁的概念有一些误解?
Locker.h
#import <Foundation/Foundation.h>
@interface Locker : NSObject { }
+ (void) purgeLocks;
+ (NSLock*) lockWithName: (NSString*) name;
+ (void) lock: (NSString*) name;
+ (void) unlock: (NSString*) name;
+ (BOOL) tryLock: (NSString*) name;
@end
Locker.m
#import "Locker.h"
static NSMutableDictionary* locks = nil;
@implementation Locker
+ (void) initialize {
locks = [[NSMutableDictionary dictionary] retain];
}
+ (void) purgeLocks {
[locks release];
[Locker initialize];
}
+ (NSLock*) lockWithName: (NSString*) name {
NSLock* lock = nil;
@synchronized([Locker class]) {
lock = [locks objectForKey: name];
if(!lock) {
lock = [[[NSLock alloc] init] autorelease];
[lock setName: name];
[locks setObject: lock forKey: name];
}
}
return lock;
}
+ (void) lock: (NSString*) name {
[[Locker lockWithName: name] lock];
}
+ (void) unlock: (NSString*) name {
[[Locker lockWithName: name] unlock];
}
+ (BOOL) tryLock: (NSString*) name {
return [[Locker lockWithName: name] tryLock];
}
@end发布于 2011-09-15 15:16:20
对我来说这看起来很重。你确定你不能简化设计吗?(GCD出现在我的脑海中。)几乎每一个iOS应用程序都是多线程的,我很少看到像你写的那样的锁定助手。如果有什么地方能让KISS principle大放异彩的话,我敢肯定那就是多线程。
发布于 2011-09-15 15:06:49
@synchronized is slow,避开它。在+ initialize中分配一个锁并使用它。但我会选择单例,而不是使用类方法,但这或多或少是一个品味问题。
这种方法的主要缺点是,您必须锁定一个锁才能获得另一个锁。在大量多线程的应用程序中,即使线程都想访问不同的锁,这个元锁(当前的@synchronized)也会成为性能瓶颈。
https://stackoverflow.com/questions/7426930
复制相似问题