线程锁

移动开发 waitig 591℃ 百度已收录 0评论

一般发生于两个线程同时去访问一个方法或变量时,去进行操作变量,就可能会产生线程的崩溃
解决办法是,在A线程去操作的时候进行加锁,另一个线程无法访问,只有等待A执行完之后进行解锁,B线程才可以进行操作
不要将过多的代码放在锁里,否则一个线程执行的时候另一个线程就一直等待,无法发挥多线程的作用了

首先声明一个可变数组属性

@property(nonatomic,strong)NSMutableArray * nameArray;

懒加载

-(NSMutableArray *)nameArray {
if (!_nameArray) {
_nameArray = [NSMutableArray arrayWithObjects:@"张",@"王",@"李",@"赵",@"刘",@"孙", nil];
}
return _nameArray;
}

使用NSLock加锁
可以将NSLok声明称属性,并初始化

[lock lock];
if (self.nameArray.count > 0) {
[self.nameArray removeLastObject];
}
[lock unlock];

synchronized 线程锁

@synchronized (self) {

    NSString * name;

    if (self.nameArray.count > 0) {

        name = self.nameArray.lastObject;

        [self.nameArray removeObject:name];
    }
}

信号量
创建一个信号量为1

dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);

 NSString * name;
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

if (self.nameArray.count > 0) {

    name = self.nameArray.lastObject;

   [self.nameArray removeObject:name];

    NSLog(@"nameArr%@thread%@",self.nameArray,[NSThread currentThread]);
}

dispatch_semaphore_signal(semaphore);

pthread 中的锁

pthread_mutex_init(&mutex, NULL);

  pthread_mutex_lock(&mutex);

NSString * name;

if (self.nameArray.count > 0) {

    name = self.nameArray.lastObject;

   [self.nameArray removeObject:name];

    NSLog(@"nameArr%@thread%@",self.nameArray,[NSThread currentThread]);
}

pthread_mutex_unlock(&mutex);`

-(void)dealloc {
pthread_mutex_destroy(&mutex);
}

这几个常用的,其它的不熟,用的少,没有过多研究

参考:
http://www.cocoachina.com/ios/20160129/15170.html
https://www.cnblogs.com/wlll/p/5175361.html
http://blog.csdn.net/qq_30513483/article/details/52349968
http://www.jianshu.com/p/35dd92bcfe8c


本文由【waitig】发表在等英博客
本文固定链接:线程锁
欢迎关注本站官方公众号,每日都有干货分享!
等英博客官方公众号
点赞 (0)分享 (0)