1374611547_Xcode.png

在iOS开发的过程中,经常会遇到多线程编程的情况,此时多线程访问同一个内存地址时,如果不加以处理则容易引发互斥,多个线程同时调用同一个方法或者修改同一个变量也会引发其他的问题。以下转载整理了几种常见的处理方式:@synchrionized、NSLock、NSRecursiveLock、NSConditionLock、NSDistributedLock。

一、@synchronized,同步

使用此方法会自动为参数对象加锁,保证区域内线程代码的安全。

...
@implementation MyClass
+ (id)shareInstance {
@synchronized(self) {
if (_myClass == nil) {
_myClass = [[self alloc] init];
}
return _myClass;
}
}
...

二、NSLock,锁

NSLock实现了NSLocking接口,包含lock(加锁)、unlock(解锁)、tryLock(尝试加锁,尝试加锁若失败不会阻塞线程,会返回NO),lockBeforeDate(若未获取锁,则在指定的时间之前加锁阻塞线程,若时间到还未获得锁,则线程被唤醒,返回NO)。

NSLock *locker = [[NSLock alloc] init];
if ([locker lock]) {
//do something
[locker unlock];
}

三、NSRecursiveLock,递归锁

递归锁多次调用不会阻塞已经获得该锁的线程。

NSRecursiveLock *locker = [[NSRecursiveLock alloc] init];
- (void)myRecursive:(int)num {
[locker lock];
if (num != 0) {
num -= 1;
[self myRecursive:num];
}
[locker unlock];
}

- (void)testRecursive {
[self myRecursive:5];
}

四、NSConditionLock,条件锁

根据条件进行加解锁。

NSConditionLock locker = [[NSConditionLock alloc] initWithCondition:NO_DATA];

//生产者
while (true) {
[locker lockWhenCondition:NO_DATA];
//生产数据
[locker unlockWithCondition:HAS_DATA];
}

//消费者
while (true) {
[locker lockWhenCondition:HAS_DATA];
//消费数据
[locker unlockWithCondition:NO_DATA];
}

五、NSDistributedLock,分布锁

分布锁采用文件的方式实现,可跨进程:tryLock(获取锁)、unlock(释放锁)、若一个获取锁的进程在释放锁之前挂了,那么锁无法得到释放,此时可透过breakLock强行获取锁。

参考网站:http://blog.csdn.net/likendsl/article/details/8568961