线程锁

来源:互联网 发布:生活用品的淘宝店名 编辑:程序博客网 时间:2024/06/16 13:43

一般发生于两个线程同时去访问一个方法或变量时,去进行操作变量,就可能会产生线程的崩溃
解决办法是,在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

原创粉丝点击