iOS中同步与锁的知识

2020-05-10  本文已影响0人  蔡锐蔡老师

所谓同步,就是指一个线程访问数据未结束的时候,其他线程不得对同一数据进行访问。

同步的手段包括4种

1)信号量:对于允许多个线程并发访问的资源,多元信号量是一个不错的选择,多元信号量简称信号量

2)互斥量:必须是哪一个线程获取这个锁,哪一个线程就要释放这个锁,其他线程释放这个锁无效

3)临界区:临界区具有和互斥量相同的性质,但作用范围仅限于本进程

4)条件变量:可以让许多线程一起等待某个事件的发生,当事件发生时,所有线程可以一起恢复执行

同步最常见的方法是锁,锁包括

1)自旋锁:线程等待锁时不会被挂起,降低线程切换的成本,适用于阻塞很短时间的case,但存在优先级反转的问题(低优先级线程获取锁,高优先级线程等待锁,导致低优先级线程无法释放锁)

代表:OSSpinLock

2)互斥锁:最常用的一种锁,线程等待锁时会被挂起,会有线程切换的成本

代表:①os_unfair_lock;②pthread_mutex,PTHREAD_MUTEX_DEFAULT;③NSLock,是②的封装

3)信号量:一般情况下我们不会使用信号量做锁的操作,大部分应用场景是将一个异步的操作变成一个同步的操作比如AFN内部的实现

代表:dispatch_semaphore

4)读写锁:是一个特定场景的同步(读取频繁,仅仅偶尔写入),一个读写锁同时只能有一个写者或者多个读者,但不能同时既有读者又有写者,有两种获取读写锁的方式,共享或者独占,行为如下

读写锁的行为

代表:①pthread_rwlock;②dispatch_barrier_async / dispatch_barrier_sync

5)条件锁:根据条件的满足进行加锁和解锁的操作

代表:①pthread_mutex,condition;②NSCondition,对①的封装;③NSConditionLock,对于②封装

6)递归锁:可以多次加锁,不会死锁

代表:①@synchronized,是标准的递归锁;②pthread_mutex,PTHREAD_MUTEX_RECURSIVE;③NSRecursiveLock,对于②的封装

7)分布锁:基于文件方式的锁机制,可以跨进程访问

代表:NSDistributedLock(只在macOS上可用)

上一篇下一篇

猜你喜欢

热点阅读