所谓同步,就是指一个线程访问数据未结束的时候,其他线程不得对同一数据进行访问。
同步的手段包括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上可用)
网友评论