为什么使用线程同步技术:多个线程是同时执行的 如果多个线程同时操作一个资源 会造成此资源的数据错乱

线程同步简介

线程同步,多条线程按顺序地访问某个资源

注意:此处的同步不是一起执行的意思 是一个一个按照顺序执行 一个执行完了 另一个才能执行

场景

当多个线程同时访问一个资源的时候 会造成该资源的混乱 此时应使用线程同步

资源: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中线程同步基本详解的更多相关文章

  1. iOS中MVC等设计模式详解

    iOS中MVC等设计模式详解 在iOS编程,利用设计模式可以大大提高你的开发效率,虽然在编写代码之初你需要花费较大时间把各种业务逻辑封装起来.(事实证明这是值得的!) 模型-视图-控制器(MVC)设计 ...

  2. java synchronized 线程同步机制详解

    Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并发线程访问同一个对象object中的这个synchronized(this ...

  3. IOS中的NSTimer定时器详解

    /* 在IOS中有多种定时器,这里我对NSTimer定时器做了一个简单的介绍.如果你是小白,你可能会从这篇文章中学习到一些知识,如果你是大牛,请别吝啬你的评论,指出我的不足,你的质疑是对我最大的帮助. ...

  4. java中线程的状态详解

    一.线程的五种状态   线程的生命周期可以大致分为5种,但这种说法是比较旧的一种说法,有点过时了,或者更确切的来说,这是操作系统的说法,而不是java的说法.但对下面所说的六种状态的理解有所帮助,所以 ...

  5. iOS中 CoreGraphics快速绘图(详解) 韩俊强的博客

    每日更新关注:http://weibo.com/hanjunqiang  新浪微博 第一步:先科普一下基础知识: Core Graphics是基于C的API,可以用于一切绘图操作 Core Graph ...

  6. IOS中的网络编程详解

    在移动互联网时代,几乎所有应用都需要用到网络,比如QQ.微博.网易新闻.优酷.百度地图,只有通过网络跟外界进行数据交互.数据更新,应用才能保持新鲜.活力,如果没有了网络,也就缺少了数据变化,无论外观多 ...

  7. iOS中UINavigationController控制器使用详解

    一.概述 UINavigationController用来管理视图控制器,在多视图控制器中常用.它以栈的形式管理视图控制器,管理视图控制器个数理论上不受限制(实际受内存限制),push和pop方法来弹 ...

  8. iOS中--NSArray调用方法详解 (李洪强)

    下面的例子以     NSArray *array = [NSArray arrayWithObjects:@"wendy",@"andy",@"to ...

  9. iOS中 蓝牙2.0详解/ios蓝牙设备详解 韩俊强的博客

    每日更新关注:http://weibo.com/hanjunqiang  新浪微博 整体布局如下:     程序结构如右图: 每日更新关注:http://weibo.com/hanjunqiang  ...

随机推荐

  1. 给 VS 2010 选一个好用的代码行数统计器(转)

    给 VS 2010 选一个好用的代码行数统计器 分类: Tricks2011-02-25 05:40 3891人阅读 评论(0) 收藏 举报 2010c 推荐一个VS插件,支持2005/2008/20 ...

  2. RestoreDirectory 引起的BUG

    IIRC, in windows XP when you press Save on a SaveFileDialog (or Open on a OpenFileDialog) the direct ...

  3. python 中变量的命名方法

    从网上找到django中python的命名规范 Python  规范 代码的布局  编码 所有的Python脚本文件都应在文件头标上“# -*- coding:utf-8 -*-”.  缩进 4个空格 ...

  4. smb:unrecognized service

    [root@sycflash ~]#service smb status smb:unrecognized service 提示:smb:unrecognized service.这时你会按照常规的方 ...

  5. 1、win32创建窗口函数(windows程序内部运行机制)

    利用win32创建窗口函数,主要操作步骤为: 1.设计一个窗口类 2.注册窗口类 3.创建窗口 4.显示及窗口更新 5.消息循环 6.窗口过程函数   (1)设计一个窗口类 设计窗口类,这样的类型已经 ...

  6. django 快速实现完整登录系统

    django 实现完整登录系统 本操作的环境: =================== Windows 7 64 python3.5 Django 1.10 =================== 创 ...

  7. appium + maven +jenkins 基本入门之二 新建maven 的java项目

    1: 下载maven : 1.0 :设置maven的环境变量: 1.1: 设置maven本地仓库: 在下载好的maven文件夹找到 apache-maven-3.3.9/conf 文件夹下的setti ...

  8. Spark Streaming源码解读之No Receivers彻底思考

    本期内容 : Direct Acess Kafka Spark Streaming接收数据现在支持的两种方式: 01. Receiver的方式来接收数据,及输入数据的控制 02. No Receive ...

  9. Effective objective-c 2.0阅读笔记

    这本书非常的好,看完后,感触挺深,总结纪录一下,针对ios开发的备忘: 注:分类和原著有些不同,自己总结学习用的,仅供参考.   系统篇: 了解oc起源:继承c,由Smalltalk演化而来.动态语言 ...

  10. python转exe的小工具

    其实只是在cxfreeze的基础上加了个壳,做成窗口软件了 使用了pyqt做的界面,软件发布在了开源中国上,可以直接去下面的地址查看 http://git.oschina.net/robocky/py ...