一、iOS中的多线程

  • 多线程的原理(之前多线程这块没好好学,之前对多线程的理解也是错误的,这里更正,好好学习这块)

  • iOS中多线程的实现方案有以下几种

二、NSThread线程类的简单实用(直接上代码)

  

三、多线程的安全隐患

  • 资源共享
    • 1块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源
    • 比如多个线程访问同一个对象、同一个变量、同一个文件
  • 当多个线程访问同一块资源时,很容易引发数据错乱和数据安全问题(存钱取钱的例子,多个售票员卖票的例子)
  • 安全隐患解决的方法 --- 互斥锁(图解)

  • 互斥锁简单介绍

  • 售票员卖票例子的代码实现
 #import "ViewController.h"

 @interface ViewController ()
/** Thread01 */
@property(nonatomic,strong) NSThread *thread01;
/** Thread02 */
@property(nonatomic,strong) NSThread *thread02;
/** Thread03 */
@property(nonatomic,strong) NSThread *thread03;
/** ticketCount */
@property(nonatomic,assign) NSInteger ticketCount;
@end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad]; self.ticketCount = ; // 线程创建之后不执行start 出了大括号会被销毁,所以这里用成员变量存了起来
self.thread01 = [[NSThread alloc] initWithTarget:self selector:@selector(saleTicket) object:nil];
self.thread01.name = @"售票员01";
self.thread02 = [[NSThread alloc] initWithTarget:self selector:@selector(saleTicket) object:nil];
self.thread02.name = @"售票员02";
self.thread03 = [[NSThread alloc] initWithTarget:self selector:@selector(saleTicket) object:nil];
self.thread03.name = @"售票员03";
} - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { [self.thread01 start];
[self.thread02 start];
[self.thread03 start]; } - (void)saleTicket
{
@synchronized(self) { // 添加互斥锁,括号中的什么对象都可以,但是必须是同一个! while () {
// 取出剩余票总数
NSInteger count = self.ticketCount;
if (count > ) {
self.ticketCount = count - ;
NSLog(@"%@卖出了车票,还剩%ld",[NSThread currentThread].name,self.ticketCount);
} else { NSLog(@"%@把车票卖完了",[NSThread currentThread].name);
break;
} }
}
} @end
  • 不加互斥锁打印的结果如图:

四、原子和非原子属性--atomic、nonatomic

五、线程之间的通信(练习:下载图片的练习)

iOS边练边学--多线程介绍、NSThread的简单实用、线程安全以及线程之间的通信的更多相关文章

  1. iOS边练边学--多线程NSOperation介绍,子类实现多线程的介绍(任务和队列),队列的取消、暂停(挂起)和恢复,操作依赖与线程间的通信

    一.NSOperation NSOperation和NSOperationQueue实现多线程的具体步骤 先将需要执行的操作封装到一个NSOperation对象中 然后将NSOperation对象添加 ...

  2. iOS边练边学--多线程练习的多图片下载 以及 使用第三方框架(SDWebImage)的多图片下载

    一.自己实现多图片下载应该注意的问题 沙盒缓存的问题 程序缓存的问题 cell重复利用显示图片混乱的问题 -- 用户拖拽快,下载图片慢导致的 解决图片混乱引入NSOperation集合的问题 资源下载 ...

  3. iOS边练边学--UIPickerView和UIDatePicker的简单使用

    一.点菜系统练习(UIPickerView) <1>UIPickerView的常用代理方法介绍 #pragma mark - <UIPickerViewDelegate> // ...

  4. iOS边练边学--Http网络再学习,简单介绍

    一.URL 什么是URL URL中常见的协议 二.Http Http的基本通信过程 发送Http请求的方法 GET 和 POST 对比 GET 和 POST 的选择 三.iOS中的Http学习 iOS ...

  5. iOS边练边学--UIGestureRecognizer手势识别器简单介绍

    iOS 3.2之后,苹果退出了手势识别功能(Gesture Recognizer),在触摸事件处理方面,大大简化了开发者的开发难度. 一.UIGestureRecognizer UIGestureRe ...

  6. iOS边练边学--UIScrollView的属性简单使用,代理的简单介绍以及内容缩放

    一.什么是UIScrollView *移动设备的屏幕大小是极其有限的,因此直接展示在用户眼前的内容也是相当有限 *当展示的内容较多,超出一个屏幕时,用户可通过滚动收拾来查看屏幕以外的内容 *普通的UI ...

  7. iOS边练边学--NSURLSession、NSURLSessionTask的介绍与使用以及url中包含了中文的处理方法

    一.NSURLSession.NSURLSessionTask的使用步骤 首先创建NSURLSession对象 通过NSURLSession对象创建对应的任务 <1>NSURLSessio ...

  8. iOS边练边学--transform的简单介绍并且用transform实现键盘处理

    一.transform:形变属性,能完成功能:平移,缩放,旋转 <平移> // 根据给的移动距离平移 self.tempView.transform = CGAffineTransform ...

  9. iOS边练边学--介绍布局的三种方法

    使用代码实现Autolayout的方法1- 创建约束 +(id)constraintWithItem:(id)view1attribute:(NSLayoutAttribute)attr1relate ...

随机推荐

  1. JavaScript功能检测技术和函数构造

    Javascript与很多编程语言不同,它不能够控制其运行环境.再写php代码时,只要在服务器端部署了正确的版本,那么程序就绝对能够运行,对于其他python或ruby后端语言来说,也不存在什么灰色区 ...

  2. python之2048

    #-*- coding:utf-8 -*- import curses from random import randrange, choice # generate and place new ti ...

  3. HDU 2298 Toxophily 【二分+三分】

    一个人站在(0,0)处射箭,箭的速度为v,问是否能够射到(x,y)处,并求最小角度. 首先需要判断在满足X=x的情况下最大高度hmax是否能够达到y,根据物理公式可得 h=vy*t-0.5*g*t*t ...

  4. React/React Native 的ES5 ES6写法对照表

    //es6与es5的区别很多React/React Native的初学者都被ES6的问题迷惑:各路大神都建议我们直接学习ES6的语法(class Foo extends React.Component ...

  5. Android学习----自适应国际化语言

    [前言] 自适应的知识与编程无关,关键在于配置文件的修改.自适应的内容包括:语言.屏幕.平台.今天就来说一下如何自适应国际化言. internationalization (国际化)简称:i18n,因 ...

  6. mac在xampp下使用yii2.0开发环境配置

    在mac上装环境,折腾了我好久.先用是mac自带的php,但自带的PHP很多扩展都需要自己安装.libevent,memcache等扩展都安装好了之后,发现pdo_mysql.dll扩展又没有,悲剧的 ...

  7. WebApi 返回小驼峰式 json 格式,并格式化日期

    from:http://blog.csdn.net/magiccops/article/details/42969363 屏蔽默认返回xml格式:Global文件加:GlobalConfigurati ...

  8. [转]2006 MySQL server has gone away错误,最大值溢出解决办法 mysql max_allowed_packet 查询和修改

    From : http://www.cnblogs.com/huangcong/archive/2013/03/26/2981790.html 1.应用程序(比如PHP)长时间的执行批量的MYSQL语 ...

  9. CHAP认证原理

    整个过程就是PPP协商过程,分三步:LCP.认证.NCP. 一 协议概述 PPP包含以下两个层次的协议: ·链路控制协议(LCP):负责建立.配置和测试数据链路连接 ·网络控制协议(NCP):负责建立 ...

  10. PHP基础17:日期

    <?php //1.PHP Date()函数,PHP Date() 函数把时间戳格式化为更易读的日期和时间. // 获得简单的日期 echo "今天是".date(" ...