iOS边练边学--多线程介绍、NSThread的简单实用、线程安全以及线程之间的通信
一、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的简单实用、线程安全以及线程之间的通信的更多相关文章
- iOS边练边学--多线程NSOperation介绍,子类实现多线程的介绍(任务和队列),队列的取消、暂停(挂起)和恢复,操作依赖与线程间的通信
一.NSOperation NSOperation和NSOperationQueue实现多线程的具体步骤 先将需要执行的操作封装到一个NSOperation对象中 然后将NSOperation对象添加 ...
- iOS边练边学--多线程练习的多图片下载 以及 使用第三方框架(SDWebImage)的多图片下载
一.自己实现多图片下载应该注意的问题 沙盒缓存的问题 程序缓存的问题 cell重复利用显示图片混乱的问题 -- 用户拖拽快,下载图片慢导致的 解决图片混乱引入NSOperation集合的问题 资源下载 ...
- iOS边练边学--UIPickerView和UIDatePicker的简单使用
一.点菜系统练习(UIPickerView) <1>UIPickerView的常用代理方法介绍 #pragma mark - <UIPickerViewDelegate> // ...
- iOS边练边学--Http网络再学习,简单介绍
一.URL 什么是URL URL中常见的协议 二.Http Http的基本通信过程 发送Http请求的方法 GET 和 POST 对比 GET 和 POST 的选择 三.iOS中的Http学习 iOS ...
- iOS边练边学--UIGestureRecognizer手势识别器简单介绍
iOS 3.2之后,苹果退出了手势识别功能(Gesture Recognizer),在触摸事件处理方面,大大简化了开发者的开发难度. 一.UIGestureRecognizer UIGestureRe ...
- iOS边练边学--UIScrollView的属性简单使用,代理的简单介绍以及内容缩放
一.什么是UIScrollView *移动设备的屏幕大小是极其有限的,因此直接展示在用户眼前的内容也是相当有限 *当展示的内容较多,超出一个屏幕时,用户可通过滚动收拾来查看屏幕以外的内容 *普通的UI ...
- iOS边练边学--NSURLSession、NSURLSessionTask的介绍与使用以及url中包含了中文的处理方法
一.NSURLSession.NSURLSessionTask的使用步骤 首先创建NSURLSession对象 通过NSURLSession对象创建对应的任务 <1>NSURLSessio ...
- iOS边练边学--transform的简单介绍并且用transform实现键盘处理
一.transform:形变属性,能完成功能:平移,缩放,旋转 <平移> // 根据给的移动距离平移 self.tempView.transform = CGAffineTransform ...
- iOS边练边学--介绍布局的三种方法
使用代码实现Autolayout的方法1- 创建约束 +(id)constraintWithItem:(id)view1attribute:(NSLayoutAttribute)attr1relate ...
随机推荐
- java lambda小纪
一个通俗的说法是 :C#委托和Java中实现了 函数式编程的方法,它是函数式编程中的概念,为了更快的处理集合,在Java,c#等静态类型语言中想要引用一个函数的一种方式,(实现了通过封装匿名方法来达到 ...
- 解密TDE加密数据库
1 找到加密的数据库,new query 2 执行sql 语句:ALTER DATABASE database_name SET ENCRYPTION OFF; DROP DATABASE ENCR ...
- ZOJ 3967 Colorful Rainbows --栈的应用
题意:给出n条y=ai*x+bi的直线.对于这些直线,如果存在x使得该直线y大于其他任意一直线,那么这条直线可以被看见,问有多少条直线可以被看见. 做法什么的不讲了,参见:http://blog.cs ...
- JavaWeb学习----JSP脚本元素、指令元素、动作元素
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- Android签名机制:生成keystore、签名、查看签名信息
转自:http://www.ourunix.org/post/146.html
- js Date日期对象的扩展
// 对Date的扩展,将 Date 转化为指定格式的String// 月(M).日(d).小时(h).分(m).秒(s).季度(q) 可以用 1-2 个占位符, // 年(y)可以用 1-4 个占位 ...
- 理解SQL Server中的权限体系(上)----主体
原文:http://www.cnblogs.com/CareySon/archive/2012/04/10/mssql-security-principal.html 简介 权限两个字,一个权力,一个 ...
- Quartz Cron 触发器 Cron Expression 的格式
转自:http://blog.csdn.net/yefengmeander/article/details/5985064 上一文中提到 Cron触发器可以接受一个表达式来指定执行JOB,下面看看这个 ...
- 关于ZIP大文件压缩
实测:4.76 GB一个单文件压缩没有什么问题. import java.io.File; import java.io.FileInputStream; import java.io.FileOut ...
- [资料]pthreads PHP
1. 参考手册http://php.net/manual/zh/book.pthreads.php 2. windows下安装php真正的多线程扩展pthreads教程http://www.think ...