app相关Objective-Cios

iOS中的原子属性(atomic)与非原子属性(nonatomi

2019-01-21  本文已影响37人  LouisDrink

iOS的类中,使用@property声明属性的时候,会有诸多前缀可以选择,其中包括strong、weak、copy、assign、readwrite、readonly、atomic、nonatomic等等。而nonatomic前缀又是我们最经常用到的前缀之一。那么我们为什么要用nonatomic前缀呢?

atmoic/nonatmoic是什么?
锁的机制

在原子性中,最为核心的机制,便是锁的机制。通过锁的机制,可以保证线程的安全性,保证成员变量的安全性,这是我们选择才不采用原子性最主要考虑的方面

那么锁是什么呢?
简而言之,锁是用来将当前操作的对象锁住,让该对象在编辑时,有且只有一个操作能执行,其他操作需在当前操作结束后才能进行

那么iOS中有哪些常用的锁呢?
自旋锁:是用于多线程同步的一种锁,线程反复检查锁变量是否可用。由于线程在这一过程中保持执行,因此是一种忙等待。一旦获取了自旋锁,线程会一直保持该锁,直至显式释放自旋锁。 自旋锁避免了进程上下文的调度开销,因此对于线程只会阻塞很短时间的场合是有效的
互斥锁(Mutex):是一种用于多线程编程中,防止两条线程同时对同一公共资源(比如全局变量)进行读写的机制。该目的通过将代码切片成一个一个的临界区而达成
读写锁:是计算机程序的并发控制的一种同步机制,也称“共享-互斥锁”、多读者-单写者锁) 用于解决多线程对公共资源读写问题。读操作可并发重入,写操作是互斥的。 读写锁通常用互斥锁、条件变量、信号量实现

ps:以上常用锁的内容参考自 SuperMario_Nil 的 iOS开发中的11种锁以及性能对比

延伸 - 自旋锁和互斥锁:
为什么nonatomic线程不安全却最为常用呢?
注意事项:
延伸:

iOS中的另一种锁 @synchronized
@synchronized 也是用来保证线程安全的一种加锁方式

// @synchronized的用法如下
@synchronized (self) {
    // 添加锁要上锁的执行代码
}
注意:
多线程延伸:
上一篇下一篇

猜你喜欢

热点阅读