线程的不安全是由于多线程访问和修改共享资源而引起的不可预测的结果。
ios多线程开发中为保证线程的安全常用到的几种锁: NSLock 、 dispatch_semaphore 、 NSCondition 、 NSRecursiveLock 、 @synchronized 。
WEAKSELF typeof(self) __weak weakSelf = self
NSLock 是OC层封装底层线程 *** 作来实现的一种锁,继承NSLocking协议。不能迭代加锁,如果发生两次lock,而未unlock过,则会产生死锁问题。
以车站购票为例,多个窗口同时售票(同步),每个窗口有人循环购票:
原子 *** 作
原子 *** 作是指不可打断的 *** 作,也就是说线程在执行 *** 作的过程中,不会被 *** 作系统挂起,而是一定会执行完,
变量属性Property中的原子定义
一般我们定义一个变量@property (nonatomic ,strong)NSLock *locknonatomic:非原子性,不会为setter方法加锁,适合内存小的移动设备;atomic:原子性,默认为setter方法加锁(默认就是atomic),线程安全。
PS: 在iOS开发过程中,一般都将属性声明为nonatomic,尽量避免多线程抢夺同一资源,尽量将加锁等资源抢夺业务交给服务器。
NSCondition常用于生产者-消费者模式,它继承了NSLocking协议,同样有lock和unlock方法。条件变量有点像信号量,提供了线程阻塞和信号机制,因此可以用来阻塞某个线程,并等待数据就绪再唤醒程序。
信号量主要有3个函数,分别是:
注意: 正常的使用顺序是先降低然后提高,这两个函数通常都是成对出现。
本文主要参考了这篇文章( https://www.cnblogs.com/crash-wu/p/4806499.html
),并对其中所能理解的部分进行一一验证,以前没怎么写过类似的,如果有什么做的不好的地方还请大家多多见谅!
iOS中的读写安全方案
思考如何实现以下场景
同一时间,只能有1个线程进行写的 *** 作
同一时间,允许有多个线程进行读的 *** 作
同一时间,不允许既有写的 *** 作,又有读的 *** 作
上面的场景就是典型的“多读单写”,经常用于文件等数据的读写 *** 作,iOS中的实现方案有
pthread_rwlock:读写锁
dispatch_barrier_async:异步栅栏调用
等待锁的线程会进入休眠
这个函数传入的并发队列必须是自己通过dispatch_queue_cretate创建的
如果传入的是一个串行或是一个全局的并发队列,那这个函数便等同于dispatch_async函数的效果
示意图
把取回来到数据结合业务逻辑,让join成为可能,然后放到一个临时表,然后join现有的表,条件匹配exists就update,不能匹配就插入,如果标记删除就删除。sqlite貌似没merge语句,所以你得写3个sql完整更新/插入和删除这3个 *** 作
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)