知识篇,iOS线程同步!!!

本文介绍了iOS开发中的线程同步概念,如串行队列、GCD、@synchronized、NSCondition、OSSpinLock和信号量等。通过实例展示了各种同步方式的使用,强调了信号量和NSLock在实际应用中的常见性。文章鼓励读者深入理解和实践线程同步,以提升开发技能。
摘要由CSDN通过智能技术生成

iOS基础开发!!!

线程同步:即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作, 其他线程才能对该内存地址进行操作。

所以这里同步应该不是一起、共同完成的意思,可理解为协调就是按预定的先后次序进行工作,好比:
‘不要和我抢了,你先等会我做完了你在做’。

线程同步目的为了多个线程都能很好的工作,合理的访问系统资源不争不抢、和谐共处。iOS开发中常用的保持线程同步有以下几种:

  • 通过线程加锁
  • 串行队列
  • GCD

### 线程加锁

常用的几种形式的锁

  • 1、 @synchronized
- (void)myMethod:(id)anObj
{
    @synchronized(anObj)
    {
        //执行的代码操作
    }
}

通过***synchronized指令***自动的添加一个互斥锁,底层通过pthread_mutex实现。通过对一段代码的使用进行加锁。其他试图执行该段代码的线程都会被阻塞,直到加锁线程退出执行该段被保护的代码段。

当在@synchronized()代码块中抛出异常的时候,Objective-C运行时会捕获到该异常,并释放信号量,并把该异常重新抛出给下一个异常处理者。

一个线程是可以以递归的方式多次调用***myMethod***。

关于参数***anObj***;

作为一个唯一标识符来标记当前线程加锁操作必须是个对象类型,所以对于同一个操作不同的线程应该用同一个对象,否则无法起到标记加锁的作用。 不能为空nil。

常见的基本都是***self***

@synchronized(self)
{
    //执行的代码操作
}

self作为标记符十分常见,但是很明显会有一个问题:

//方法1
- (void)myMethod1:(id)anObj
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT , 0), ^{
        @synchronized(anObj)
        {
            //执行的代码操作
        }
    });
}
//方法2
- (void)myMethod2:(id)anObj
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT , 0), ^{
     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值