ios线程同步(各种锁)

author author     2023-02-16     343

关键词:

参考技术A

在iOS开发中经常会遇到一块资源被多个线程共享的情况,也就是多个线程会访问同一块资源,比如多个线程访问同一个对象、同一个变量、同一个文件,当多个线程访问同一块资源时,很容易引发数据错乱和数据安全问题

使用线程同步技术(同步就是协同步调,按预定的先后顺序进行),常见的同步技术时加锁

OSSpinLock叫做”自旋锁”,等待锁的线程会处于忙等(busy-wait)状态,一直占用着CPU资源,目前已经不再安全,从iOS10已经废弃了,可能会出现优先级反转问题,如果等待锁的线程优先级较高,它会一直占用着CPU资源,优先级低的线程就无法释放锁,使用需要导入头文件#import <libkern/OSAtomic.h>。

os_unfair_lock用于取代不安全的OSSpinLock ,从iOS10开始才支持,从底层调用看,等待os_unfair_lock锁的线程会处于休眠状态,并非忙等,使用需要导入头文件#import <os/lock.h>。

mutex叫做”互斥锁”,等待锁的线程会处于休眠状态,使用需要导入头文件#import <pthread.h>

NSLock、NSRecursiveLock是对mutex普通锁的封装,NSLock遵守NSLocking协议

初始化锁 NSLock *lock = [[NSLock alloc] init];
NSRecursiveLock也是对mutex递归锁的封装,API跟NSLock基本一致

NSCondition是对mutex和cond的封装,NSCondition遵守NSLocking协议

NSCondition通常用于生产者消费者模式的业务中,当不满足条件时调用wait方法让消费者线程等待,当条件满足时调用signal方法通知消费者线程。

NSConditionLock是对NSCondition的进一步封装,可以设置具体的条件值

NSConditionLock都可以设置不同线程间的依赖,让满足条件值的线程先执行,不满足条件的线程处于等待状态。

semaphore叫做”信号量”,信号量的初始值,可以用来控制线程并发访问的最大数量,信号量的初始值为1,代表同时只允许1条线程访问资源,保证线程同步

@synchronized是对mutex递归锁的封装,源码查看:objc4中的 objc-sync.mm 文件,@synchronized(obj)内部会生成obj对应的递归锁,然后进行加锁、解锁操作

性能从高到底排序

dispatch_barrier_async

dispatch_barrier_async又叫栅栏函数,这个函数传入的并发队列必须是自己通过dispatch_queue_cretate创建的,如果传入的是一个串行或是一个全局的并发队列,那这个函数便等同于dispatch_async函数的效果,使用栅栏函数可以保证同一时间只有一个线程可进行写操作,读操作可以有多少个线程进行。

C# 中各种线程同步选项有啥区别?

】C#中各种线程同步选项有啥区别?【英文标题】:WhatarethedifferencesbetweenvariousthreadingsynchronizationoptionsinC#?C#中各种线程同步选项有什么区别?【发布时间】:2010-09-2300:05:24【问题描述】:谁能解释一下两者的区别:锁定(某个对... 查看详情

多线程安全问题及各种锁

参考技术A多线程使用不当会出现资源竞争,比如多个线程同时对一块资源进行修改,就会很容易引发数据错乱和数据安全问题。示例:以购票系统为例,对于多线程出现的这种问题,我们的解决办法就是使用线程同步技术,而常... 查看详情

同步锁(代码片段)

...:全局解释锁  因为有GIL,所以,同一时刻,只有一个线程被cpu执行处理方法:多进程+协程任务种类:IO密集型     计算密集型对于IO密集型的任务,Python的多线程时有意义的          可以采用多进程+协程... 查看详情

java中悲观锁的底层实现机制

...础。比如各种锁:ReentrantLock、ReadWriteLock、StampedLock各种线程同步工具类:CountDownLatch、CyclicBarrier、Semaphore线程池中的WorkerLock接口的实现基本都是通过聚合了一个AQS的子类来完成线程访问控制的。D 查看详情

pthread的各种同步机制

...satwy.com/pthreadde-ge-chong-tong-bu-ji-zhi.htmlpthread是POSIX标准的多线程库,UNIX、Linux上广泛使用,windows上也有对应的实现,所有的函数都是pthread打头,也就一百多个函数,不是很复杂。然而多线程编程被普遍认为复杂,主要是因为多线... 查看详情

《重要》内核下各种同步处理方法(自旋锁信号灯互斥体…)

...p;http://www.blogfshare.com/kernel-synchronization.html 1.在支持多线程的操作系统下,有些函数会出现不可重入的现象。所谓“可重入”是指函数的执行结果不和执行顺序有关。反之如果执行结果和执行顺序有关,则称这个函数是&... 查看详情

aqs:java中悲观锁的底层实现机制(代码片段)

...础。比如各种锁:ReentrantLock、ReadWriteLock、StampedLock各种线程同步工具类:CountDownLatch、CyclicBarrier、Semaphore线程池中的WorkerLock接口的实现基本都是通过聚合了一个AQS的子类来完成线程访问控制的。D 查看详情

gil锁,线程池,同步异步

...python.exe进程中只有一分解释器,如果这个进程开启了多个线程都要执行代码多线程之间要竞争解释器,一旦竞争就有可能出现问题带来的问题:同一时间只有一个线程可以访问解释器好处:保证了多线程的数据完全thread-safe线程安全... 查看详情

001-多线程-锁-架构同步锁juc锁

...原理是,对于每一个对象,有且仅有一个同步锁;不同的线程能共同访问该同步锁。但是,在同一个时间点,该同步锁能且只能被一个线程获取到。这样,获取到同步锁的线程就能进行CPU调度,从而在 查看详情

同步-同步锁-死锁-线程交互-线程综合示例

一、同步1.作用:为了避免多个线程同时访问并修改共享数据所导致的不安全问题。2.使用synchronized(对象){}方式。二、机制1.当线程要进入某个被“同步锁”锁住代码之前,线程必须先获得“同步锁对象”2.保证任何时刻,只有一... 查看详情

浅谈各种锁机制

...行一个方法太难了,到处都是锁。重量级锁如果你学过多线程,那么你肯定知道锁这个东西,至于为什么需要锁,我就不给你普及了,就当做你是已经懂的了。我们知道,我们要进入一个同步、线程安全的方法时,是需要先获得... 查看详情

javaionio并发锁详解(代码片段)

...型同步IO和异步IO同步IO阻塞IO非阻塞IO异步IO并发并发概念线程的使用线程的状态其他概念CPU密集型vsIO密集型并发深入并发优缺点线程安全并发实战CAS锁并发集合和工具多线程优化总结IOIO的定义与类型I/O,即Input/Output(输入/输... 查看详情

fdsfsdfsdfsdfsdf

java基本运算各种运算符用法等进位二进制左移右移多线程基础多线程进阶线程池java原子性操作等基础java的concurrent包以及各种java自带系统属性的理解和应用volitaleSynchronizedReentrantLocktransientjava的锁15种锁的分类和理解等信息javaiob... 查看详情

同步锁

1.产生线程安全的问题的原因当多条语句操作同一线程的共享数据时,一个线程对多条语句值执行了一部分,还没执行完,另一个线程参与进来执行,导致共享数据时错误的2.解决办法对多条操作共享数据的语句,执行完毕,才... 查看详情

线程共享数据的安全问题

加同步代码:加了同步代码后,线程进同步判断锁,获取锁,出同步释放锁,导致了线程运行速度的下降方式一:同步代码块  解决线程安全问题,java程序提供了线程同步技术  synchronized(任意对象)    线程要操作的共... 查看详情

java多线程--“锁”总览

...原理是,对于每一个对象,有且仅有一个同步锁;不同的线程能共同访问该同步锁。但是,在同一个时间点,该同步锁能且只能被一个线程获取到。这 查看详情

java并发

线程池(java各种线程池设计、线程池原理)  多线程通信同步锁(各种锁、信号量、条件变量等)  多线程之间协作[CountDownLatch\CyclicBarrier]CountDownLatch:类似于一个计数器。单个线程可重入。调用awit()方法阻塞,等... 查看详情

多线程请求时同步锁授予顺序?

】多线程请求时同步锁授予顺序?【英文标题】:synchronizedlockgrantorderwhenmultiplethreadaskforit?【发布时间】:2014-02-2817:03:06【问题描述】:当一个线程已经获得锁时,当多个线程尝试在同步时获得锁。我的理解是锁将按照获取锁请... 查看详情