谈到线程同步,一般指如何对线程间共享数据的同步读写,如何避免混乱的读写结果。一个基本的解决办法就是使用锁(LOCK)。

iOS提供多种同步锁的类和方法,这里介绍下基本用法。

1. NSLock:最基本的同步锁,使用lock来获得锁,unlock释放锁。如果其它线程已经使用lock,这时lock方法会阻塞当前线程,直到其它线程调用unlock释放锁为止。NSLock锁一般用于简单的同步算法。比如生产者线程产生数据(produce),消费线程显示数据(consume),可以这样实现:

- (void)produce

{

  while (1)

  {

    [theLock lock];

    // create data

    [theLock unlock];

  }

}

- (void)consume

{

  while (1)

  {

    if ([theLock tryLock])

    {

      // display data

      [theLock unlock];

    }

    sleep(1.0); //sleep a while

  }

}

NSLock的tryLock方法可以避免阻塞当前线程,如果不能获得锁则返回NO。也可使用:

- (BOOL)lockBeforeDate:(NSDate *)limit;

设置超时返回时间。

2. NSConditionLock,即条件锁,可以设置自定义的条件来获得锁。比如上面的例子可以这样改用条件锁实现:

- (void)produce

{

  while (1)

  {

    [theLock lockWhenCondition:NO_DATA];

    // create data

    [theLock unlockWithCondition:HAS_DATA];

  }

}

- (void)consume

{

  while (1)

  {

    if ([theLock tryLockWhenCondition:HAS_DATA])

    {

      // display data

      [theLock unlockWithCondition:NO_DATA];

    }

    sleep(1.0); //sleep a while

  }

}

3. NSCondition:条件(一种信号量),类似Java中的Condition,但有所不同的是NSCondition是锁和条件的组合实现。wait方法用于线程的等待(相当于Java Condition的await()),然后通过signal方法通知等待线程(相当于Java Condition的signal()),或者broadcast通知所有等待的线程相当于Java Condition的signalAll())。一个简单生产消费同步例子:

- (void)produce

{

  [theLock lock];

  // create data

  hasData = YES;

  [theLock signal]; //这时通知调用wait的线程结束等待并返回

  [theLock unlock];

}

- (void)consume

{

  [theLock lock];

  while (!hasData)

    [theLock wait]; //注意:这时其它线程的lock调用会成功返回

  //display data

  hasData = NO;

  [theLock unlock];

}

 

4. NSRecursiveLock:递归锁,顾名思义一般用于递归程序。它可以让同一线程多次获得锁,解锁次数也必须相同,然后锁才能被其它线程获得。看下官网文档中的简单例子就能明白:

void MyRecursiveFunction(int value) 

  [theLock lock]; 

  if (value != 0) 

  { 

    --value; 

    MyRecursiveFunction(value); 

  }

  [theLock unlock];

}

当然不只用于递归程序,类似Java中的ReentrantLock。

5. @synchronized实现对象锁,类似Java中synchronized关键词。一般这样使用,但不多啰嗦了:

@synchronized(anObj) 

//......

}

iOS多线程的初步研究(二)-- 锁的更多相关文章

  1. iOS多线程的初步研究1

    iOS多线程的初步研究(一) 对于多线程的开发,iOS系统提供了多种不同的接口,先谈谈iOS多线程最基础方面的使用.产生线程的方式姑且分两类,一类是显式调用,另一类是隐式调用. 一.显示调用的类为NS ...

  2. iOS多线程的初步研究(六)

    iOS多线程的初步研究(六) iOS平台提供更高级的并发(异步)调用接口,让你可以集中精力去设计需完成的任务代码,避免去写与程序逻辑无关的线程生成.运行等管理代码.当然实质上是这些接口隐含生成线程和管 ...

  3. iOS多线程的初步研究3

    iOS多线程的初步研究(三) 弄清楚NSRunLoop确实需要花时间,这个类的概念和模式似乎是Apple的平台独有(iOS+MacOSX),很难彻底搞懂(iOS没开源,呜呜). 官网的解释是说run ...

  4. iOS多线程的初步研究

    iOS多线程的初步研究(四) 理解run loop后,才能彻底理解NSTimer的实现原理,也就是说NSTimer实际上依赖run loop实现的. 先看看NSTimer的两个常用方法: + (NST ...

  5. iOS多线程的初步研究(一)-- NSThread

    对于多线程的开发,iOS系统提供了多种不同的接口,先谈谈iOS多线程最基础方面的使用.产生线程的方式姑且分两类,一类是显式调用,另一类是隐式调用. 一.显示调用的类为NSThread.一般构造NSTh ...

  6. iOS多线程的初步研究(六)-- NSOperation

    iOS平台提供更高级的并发(异步)调用接口,让你可以集中精力去设计需完成的任务代码,避免去写与程序逻辑无关的线程生成.运行等管理代码.当然实质上是这些接口隐含生成线程和管理线程的运行,从而更加简洁地实 ...

  7. iOS多线程的初步研究(三)-- NSRunLoop

    弄清楚NSRunLoop确实需要花时间,这个类的概念和模式似乎是Apple的平台独有(iOS+MacOSX),很难彻底搞懂(iOS没开源,呜呜). 官网的解释是说run loop可以用于处理异步事件, ...

  8. iOS多线程的初步研究(八)-- dispatch队列

    GCD编程的核心就是dispatch队列,dispatch block的执行最终都会放进某个队列中去进行,它类似NSOperationQueue但更复杂也更强大,并且可以嵌套使用.所以说,结合bloc ...

  9. iOS多线程的初步研究(十)-- dispatch同步

    GCD提供两种方式支持dispatch队列同步,即dispatch组和信号量. 一.dispatch组(dispatch group) 1. 创建dispatch组 dispatch_group_t ...

随机推荐

  1. Linux内核学习笔记——VFS

    概念: ①硬链接:若一个 inode 号对应多个文件名,则称这些文件为硬链接.即硬链接就是同一个文件使用了多个别名.硬链接可由命令 link 或 ln 创建. 其特性: 文件有相同的 inode 及 ...

  2. esp和ebp详解

    最近在研究栈帧的结构,但总是有点乱,所以写了一个小程序来看看esp和ebp在栈帧中的作用.这个程序如下: 这个程序很简单,就是求两个数的值,然后输出即可.所以首先把它用gcc编译链接成a.out,进入 ...

  3. 使用工厂bean和Utility Schema定义集合

    工厂bean是实现了beanFactory接口的bean,也可以继承AbstractFactoryBean,主要是用于在给定属性参数之后自动创建一个bean对象. 我们在使用基本集合标记定义集合时,不 ...

  4. 管理员必备的20个Linux系统监控工具

    需要监控Linux服务器系统性能吗?尝试下面这些系统内置或附件的工具吧.大多数Linux发行版本都装备了大量的监控工具.这些工具提供了能用作取得相关信息和系统活动的量度指标.你能使用这些工具发现造成性 ...

  5. 集成友盟分享SDK报错

    删除4.2.1版本的reference换成4.3版本运行报错 解决办法:要将4.2.1版本的全部库文件物理删除,不要只删除reference.

  6. P1297: [SCOI2009]迷路

    首先知道,如果没有路径长度的要求,且给定的邻接矩阵只有0和1表示通与不通的话,从S->E走N次的方案数就是这个矩阵自乘N次后的(S,E)的数值.这样的话只需要快速幂+矩阵乘法即可过关. (转载请 ...

  7. C++设计模式——代理模式

    前言 青春总是那样,逝去了才开始回味:大学生活也是在不经意间就溜走了,现在上班的时候,偶尔还会怀念大学时,大家在一起玩游戏的时光.大学喜欢玩游戏,但是可悲的校园网,速度能把人逼疯了:还好,后来搞了一个 ...

  8. responsive layout

    http://cssdeck.com/labs/7wsdvxdc http://getbootstrap.com/css/ http://getbootstrap.com/2.3.2/scaffold ...

  9. Kakfa

    Kakfa分布式集群搭建 本位以最新版本kafka_2.11-0.10.1.0版本讲述分布式kafka集群环境的搭建过程.服务器列表: 1 2 3 172.31.10.1 172.31.10.2 17 ...

  10. Windows Phone 8 实现列表触底加载

    [背景] 很多时候在做WP开发的过程中会遇到数据需要分页获取,根据微软官方的推荐方式,建议实现为Market中类似的体验,即滑动到列表的底部的时候加载更多的数据. 这一需求在早起WP7.1时代实现起来 ...