iOS中线程同步基本详解
为什么使用线程同步技术:多个线程是同时执行的 如果多个线程同时操作一个资源 会造成此资源的数据错乱
线程同步简介
线程同步,多条线程按顺序地访问某个资源
注意:此处的同步不是一起执行的意思 是一个一个按照顺序执行 一个执行完了 另一个才能执行
场景:
当多个线程同时访问一个资源的时候 会造成该资源的混乱 此时应使用线程同步
资源:Toilet男女共用
线程:peopleA、peopleB(女)、peopleC
互斥锁,就是线程同步技术的体现
场景: 两个售票员售票
两个线程 名字分别是 售票员A、售票员B
同样的工作卖票:
1、先获取票数 int count = self.ticketsCount
2、判断票是否卖完了 if(count>0)
3、暂停一会分线程 0.002 (保证两个都获取到了总票数 模拟理论上的情况)
4、票数等于检查票数减一 self.ticketsCount = count-1
5、获取当前线程
6、打印当前线程、以及剩余票数
iOS应用程序中支持多任务。这意味着可能有两个线程同时试图修改同一个对象。有一个办法可以解决这个情况。为了防止多个线程同时执行同一个代码块,OC提供了@synchronized()指令。
使用@synchronized()指令可以锁住在线程中执行的某一个代码块。使用代码块的其他线程,将被阻塞,这也就意味着,他们将在@synchronized()代码块的最后一条语句执行结束后才能继续执行。
一般在操作公用资源的时候使用,如单例模式或者操作类的static变量中使用。
@synchronized(对象A){需要线程同步的代码}
对象A是一个用来区别保护块的唯一标识符 其实就是相当于一把锁
如下所示 如果不同线程传递不同的对象 那么将不会起到线程同步的作用
通常都在此处传self @“123” @“456” id 任意对象类型 等价于 NSObject *
反例
- (void)myMethod:(id)anyObject { @synchronized(anyObject){ } }
互斥锁的优缺点 NSLock
优点:能有效防止因多线程抢夺资源造成的数据安全问题
缺点:需要消耗大量的CPU资源
补充知识:
OC在定义属性时有nonatomic和atomic两种选择
atomic:默认的property关键字,原子属性,为set方法加锁 线程安全(默认就是atomic)
nonatomic:非原子属性,不会为setter方法加锁 非线程安全
atomic加锁原理
@property (assign) int age;
- (void)setAge:(int)age
{
@synchronized(self) {
_age = age;
}
}
自动释放池 NSAutoreleasePool
当你向对象发送一个autorelease消息 该对象会被标记 进入自动释放池 当自动释放池释放时会调用release或drain方法先销毁池中的对象 然后销毁自己
推荐:drain
使用场景:
a、线程中使用自动释放池来包裹代码
b、局部产生大量autorelease对象 比如线程中的循环中
1、NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[pool release] 或者 [pool drain]
上面两者没有本质的区别 在GC环境下release无效 建议drain
2、@autorelease{
}
iOS中线程同步基本详解的更多相关文章
- iOS中MVC等设计模式详解
iOS中MVC等设计模式详解 在iOS编程,利用设计模式可以大大提高你的开发效率,虽然在编写代码之初你需要花费较大时间把各种业务逻辑封装起来.(事实证明这是值得的!) 模型-视图-控制器(MVC)设计 ...
- java synchronized 线程同步机制详解
Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并发线程访问同一个对象object中的这个synchronized(this ...
- IOS中的NSTimer定时器详解
/* 在IOS中有多种定时器,这里我对NSTimer定时器做了一个简单的介绍.如果你是小白,你可能会从这篇文章中学习到一些知识,如果你是大牛,请别吝啬你的评论,指出我的不足,你的质疑是对我最大的帮助. ...
- java中线程的状态详解
一.线程的五种状态 线程的生命周期可以大致分为5种,但这种说法是比较旧的一种说法,有点过时了,或者更确切的来说,这是操作系统的说法,而不是java的说法.但对下面所说的六种状态的理解有所帮助,所以 ...
- iOS中 CoreGraphics快速绘图(详解) 韩俊强的博客
每日更新关注:http://weibo.com/hanjunqiang 新浪微博 第一步:先科普一下基础知识: Core Graphics是基于C的API,可以用于一切绘图操作 Core Graph ...
- IOS中的网络编程详解
在移动互联网时代,几乎所有应用都需要用到网络,比如QQ.微博.网易新闻.优酷.百度地图,只有通过网络跟外界进行数据交互.数据更新,应用才能保持新鲜.活力,如果没有了网络,也就缺少了数据变化,无论外观多 ...
- iOS中UINavigationController控制器使用详解
一.概述 UINavigationController用来管理视图控制器,在多视图控制器中常用.它以栈的形式管理视图控制器,管理视图控制器个数理论上不受限制(实际受内存限制),push和pop方法来弹 ...
- iOS中--NSArray调用方法详解 (李洪强)
下面的例子以 NSArray *array = [NSArray arrayWithObjects:@"wendy",@"andy",@"to ...
- iOS中 蓝牙2.0详解/ios蓝牙设备详解 韩俊强的博客
每日更新关注:http://weibo.com/hanjunqiang 新浪微博 整体布局如下: 程序结构如右图: 每日更新关注:http://weibo.com/hanjunqiang ...
随机推荐
- 视频演示eworkflow集成定制aspx页面的过程
eworkflow自定义工作流系统,集成eform自定义表单,可以做到在线编辑流程,在线编辑表单.eform也提供在线建立业务表,维护表字段等,所以通过eworkflow+eform可以在线完成业务流 ...
- java中的集合和区别
Iterator接口是负责定义访问和遍历元素的接口 Connection接口存储了一组不唯一(允许重复)的无序对象 Set接口继承了Connection接口,主要用来存储一组唯一(不允许重复的),无序 ...
- 十五、polygon API
How polygons are handled internally The five basic polygonal API classes Construction History and Tw ...
- [转载] 在java中为什么变量1000 = 1000 返回false,但是100=100返回true?
ps:题目的意思是指定义相同内容的不同变量之间的==比较.如果直接比较(100 == 100)的结果是true. 运行以下代码: Integer a = 1000, b = 1000; System. ...
- dojo GridX 用法
1. 表格的加载显示 function CreateGrid() { var store = new dojo.store.Memory({ data: [ { id: 1, UserName: &q ...
- linux 下 TeXmacs 作 Mathematica 10 的前端
TeXmacs可以作很多种数学软件的前端,比如maxima,octave,R等.甚至还可以作mathematica的前端.TeXmacs的mathematica 插件比较老,默认条件下无法运行math ...
- Spark的数据存储
Spark本身是基于内存计算的架构,数据的存储也主要分为内存和磁盘两个路径.Spark本身则根据存储位置.是否可序列化和副本数目这几个要素将数据存储分为多种存储级别.此外还可选择使用Tachyon来管 ...
- WeedFS0.6.8-引用库列表
WeedFS 0.68新增了对cassandra数据库存储的支持及JSON Web Token(JWTs)安全的支持. github.com/gocql/gocql //filer/cassandra ...
- C++:名字查找先于类型检查
Sub-Title: Name Hiding. "In C++, there is no overloading across scopes - derived class scopes a ...
- bootstrap style for jQuery UI Dialog
页面引用: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> ...