底层22: 多线程-atomic
2020-09-09 本文已影响0人
张无奈
atomic:
用于保证属性setter、getter的原子性操作,相当于在getter和setter内部加了线程同步的锁;
可以参考源码objc4的objc-accessors.mm;
它并不能保证使用属性的过程是线程安全的。(个人理解:在setter,getter方法内部是安全的,但在外面调用的时候并不能保证安全)
nonatomic和atomic区别(atom:原子,不可再分割的单位、atomic:原子性)
给属性加上atomic修饰,可以保证属性的setter和getter都是原子性操作,也就是保证setter和gette内部是线程同步的
原子性操作:个人理解就是不可分割的操作,操作是一个整体,也就是在setter,getter方法前后有加锁的方法,导致里面是一个整体,在没有解锁的情况下别的进来无法操作。
iOS中的读写安全方案
同一时间,只能有1个线程进行写的操作
同一时间,允许有多个线程进行读的操作
同一时间,不允许既有写的操作,又有读的操作
上面的场景就是典型的"多读单写",经常用于文件等数据等读写操作,ios中的实现方案有:
1、pthread_rwlock:(读写锁) 等待锁的线程会进入休眠
2、dispatch_barrier_async:异步栅栏调用
这个函数传入的是并发队列必须是自己通过dispatch_queue-create创建的
如果传入的是一个串行或者是一个全局的并发队列,那这个函数便等同于dispatch_async函数的效果。
IO操作:文件操作
1.从文件中读取内容
2.从文件中写入内容