美文网首页iOS
iOS 线程同步的方法

iOS 线程同步的方法

作者: BigLuckyHaha | 来源:发表于2016-12-09 21:08 被阅读1206次

一般情况下我们使用线程,在多个线程共同访问同一块资源。为保护线程资源的安全和线程访问的正确性。采用线程同步的方法。

在IOS中 线程同步方法有很多种,

1. 加锁

加锁的方式有很多种 NSLock NSConditionLock NSRecursiveLock NSCondition 具体使用区别可以参考官方文档。
(1) NSLock方式

同步代码块

[xxxlock lock] //上锁

[xxxlock unlock]//解锁

NSCondition方式
同步代码块

[xxxCondition lock] //上锁
[xxxCondition unlock]//解锁

(2) @synchronized关键字提供了互锁功能。

@synchronized( 同一对象){
线程执行代码;
}
在使用synchronized的时候,括号中我们一般情况下只需要传一个self即可。同步代码块 当有线程进去之后会把括号里面对象的锁旗标锁上,其他线程会在外面等着 当进去的线程出去的时候会把锁打开 其余线程再进一个。这样才能保护线程放问资源的安全性。

线程资源防控示例代码:

-(void)sellTickets{
    
    while (YES) {
        NSString *name = [NSThread currentThread].name;
//       同步代码块 当有线程进去之后会把括号里面对象的锁旗标锁上,其他线程会在外面等着 当进去的线程出去的时候会把锁打开 其余线程再进一个
//        @synchronized(self){
//        [self.myLock lock];
        [self.myCondition lock];
            NSLog(@"%@开始卖%d号票",name,self.selledCount+1);
            [NSThread sleepForTimeInterval:.2];
            self.selledCount++;
            NSLog(@"%@卖掉了%d号票,还剩%d张",name,self.selledCount,self.totalCount-self.selledCount);
//         [self.myLock unlock];
        [self.myCondition unlock];

        }
//    }
    
}

2.采用串行队列的思想

线程同步不等于线程锁。要解决同步问题,首先需要了解为什么需要线程同步,线程不同步主要原因在于多个线程可能同时操作某个对象从而导致状态不一致的问题。是不是可以这么理解,如果多线程不会同一时刻访问对象就解决了同步问题。如何做到这一点?可以采用串行队列的思想,何为串行队列?可以简单理解为所有操作都必须按顺序依次执行。主线程就是串行队列,最简单的同步方式就是把同步操作放到主线程执行。当然不能全部放在主线程,还要放在子线程。

GCD 同步

GCD可能是创建子线程最简单的方式之一,既然要实现线程同步,首先需要创建串行队列

_queue = dispatch_queue_create("com.olinone.synchronize.serialQueue", NULL);
dispatch_queue_t dQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
dispatch_set_target_queue(_queue, dQueue);

然后,将所有同步事件依次加入队列中即可确保多线程同步

dispatch_async(_queue, ^{
    block();
});
NSOperationQueue同步

通过GCD的方式即可满足绝大多数需求,但是也难免有个别特殊需求,比如操作的取消。此时,NSOperationQueue将是不错的选择

NSOperationQueue虽然是并发多线程池,但是巧妙的设计也可以让其实现串行队列的功能。当maxConcurrentOperationCount=1的时候,同一时刻只有一个NSOperation被执行,NSOperationQueue就由并发执行变成串行执行

NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];
operationQueue.maxConcurrentOperationCount  = 1;

实现方式与GCD一样,依次将同步操作加入到线程池中即可实现同步操作的串行执行

- (void)execSyncBlock:(void (^)())block {
    if (NSOperationQueue.currentQueue == self) {
        block();
    } else {
        NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:block];
        [self addOperations:@[operation] waitUntilFinished:YES];
    }
}

HJSynchronizeDemo详细展示了实际使用方式。巧妙的利用串行队列可以带来意想不到的效果。除了解决多线程同步,还能够处理串行式大计算等业务,比如图片渲染,音频处理等等

相关文章

  • iOS线程同步

    iOS线程同步 iOS线程同步

  • 起底多线程同步锁(iOS)

    起底多线程同步锁(iOS) 起底多线程同步锁(iOS)

  • iOS 线程同步的方法

    一般情况下我们使用线程,在多个线程共同访问同一块资源。为保护线程资源的安全和线程访问的正确性。采用线程同步的方法。...

  • 细数iOS中的线程同步方案(一)

    细数iOS中的线程同步方案(一)细数iOS中的线程同步方案(二) 多线程安全问题 多个线程可能访问同一块资源,比如...

  • iOS 多线程基础

    转自:iOS 多线程基础 - 简书 多线程同步和异步的区别?IOS中如何实现多线程的同步? 异步:可以同时执行多条...

  • 细数iOS中的线程同步方案(二)

    细数iOS中的线程同步方案(一)细数iOS中的线程同步方案(二) NSLock 这个其实就是对pthread_mu...

  • 线程锁

    探讨iOS开发中各种锁使用NSCondition实现多线程同步 NSCondition是线程同步, 阻塞线程。 取...

  • iOS常用锁的研究

    iOS常用锁的研究 背景 iOS并发编程除了常用的多线程技术外,线程间同步的方法也是另外一个重要的点. 公司的项目...

  • iOS-线程同步详解

    原文发表在个人博客iOS-线程同步详解,转载请注明出处。 本文对iOS系统上的线程的同步方式进行了讲解。 同步工具...

  • iOS复习之多线程

    关于iOS多线程,你看我就够了iOS多线程--彻底学会多线程使用dispatch_group来进行线程同步 iOS...

网友评论

    本文标题:iOS 线程同步的方法

    本文链接:https://www.haomeiwen.com/subject/otiemttx.html