一、iOS中的多线程

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

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

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

  

三、多线程的安全隐患

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

  • 互斥锁简单介绍

  • 售票员卖票例子的代码实现
  1. #import "ViewController.h"
  2.  
  3. @interface ViewController ()
  4. /** Thread01 */
  5. @property(nonatomic,strong) NSThread *thread01;
  6. /** Thread02 */
  7. @property(nonatomic,strong) NSThread *thread02;
  8. /** Thread03 */
  9. @property(nonatomic,strong) NSThread *thread03;
  10. /** ticketCount */
  11. @property(nonatomic,assign) NSInteger ticketCount;
  12. @end
  13.  
  14. @implementation ViewController
  15.  
  16. - (void)viewDidLoad {
  17. [super viewDidLoad];
  18.  
  19. self.ticketCount = ;
  20.  
  21. // 线程创建之后不执行start 出了大括号会被销毁,所以这里用成员变量存了起来
  22. self.thread01 = [[NSThread alloc] initWithTarget:self selector:@selector(saleTicket) object:nil];
  23. self.thread01.name = @"售票员01";
  24. self.thread02 = [[NSThread alloc] initWithTarget:self selector:@selector(saleTicket) object:nil];
  25. self.thread02.name = @"售票员02";
  26. self.thread03 = [[NSThread alloc] initWithTarget:self selector:@selector(saleTicket) object:nil];
  27. self.thread03.name = @"售票员03";
  28. }
  29.  
  30. - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
  31.  
  32. [self.thread01 start];
  33. [self.thread02 start];
  34. [self.thread03 start];
  35.  
  36. }
  37.  
  38. - (void)saleTicket
  39. {
  40. @synchronized(self) { // 添加互斥锁,括号中的什么对象都可以,但是必须是同一个!
  41.  
  42. while () {
  43. // 取出剩余票总数
  44. NSInteger count = self.ticketCount;
  45. if (count > ) {
  46. self.ticketCount = count - ;
  47. NSLog(@"%@卖出了车票,还剩%ld",[NSThread currentThread].name,self.ticketCount);
  48. } else {
  49.  
  50. NSLog(@"%@把车票卖完了",[NSThread currentThread].name);
  51. break;
  52. }
  53.  
  54. }
  55. }
  56. }
  57.  
  58. @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. docker-containerd 启动流程分析

    一般在docker启动时,containerd的启动命令如下所示: root 2090 0.0 0.1 292780 11008 ? Ssl 10月22 0:12 docker-containerd ...

  2. html5 实现video标签的自定义播放进度条

    现在随着html5的渐热,越来越多的web开发者都开始选择使用html5写出一些比较好的web应用. html代码: <!DOCTYPE html> <html lang=" ...

  3. HDU 4793 Collision --解方程

    题意: 给一个圆盘,圆心为(0,0),半径为Rm, 然后给一个圆形区域,圆心同此圆盘,半径为R(R>Rm),一枚硬币(圆形),圆心为(x,y),半径为r,一定在圆形区域外面,速度向量为(vx,v ...

  4. Java虚拟机详解01----初识JVM

    主要内容如下: JVM的概念 JVM发展历史 JVM种类 Java语言规范 JVM规范 一.JVM的概念: JVM: Java Virtual Machine,意为Java虚拟机. 虚拟机: 指通过软 ...

  5. 【shiro】shiro学习笔记1 - 初识shiro

    [TOC] 认证流程 st=>start: Start e=>end: End op1=>operation: 构造SecurityManager环境 op2=>operati ...

  6. java 16 - 5 LinkedList模拟栈数据结构的集合

    请用LinkedList模拟栈数据结构的集合,并测试 题目的意思是: 你自己的定义一个集合类,在这个集合类内部可以使用LinkedList模拟. package cn_LinkedList; impo ...

  7. java 11-7String类里的方法的一些案例

    1. 把int数组拼接成字符串的案例 需求:把数组中的数据按照指定个格式拼接成一个字符串 举例: int[] arr = {1,2,3}; 分析: A:首先定义一个空的字符串 B:其次先给这个字符串拼 ...

  8. Android 手势识别类 ( 二 ) GestureDetector 源码浅析

    前言:Android 关于手势的操作提供两种形式:一种是针对用户手指在屏幕上划出的动作而进行移动的检测,这些手势的检测通过android提供的监听器来实现:另一种是用 户手指在屏幕上滑动而形成一定的不 ...

  9. 时间与NSString转换

    //传进来时间字符串转换 + (NSString *) getChatTimeString:(NSString *)timeString { if (timeString==nil || timeSt ...

  10. TCP之心跳包实现思路

    说起网络应用编程,想到最多的就是聊天类的软件.当然,在这类软件中,一般都会有一个用户掉线检测功能.今天我们就通过使用自定义的HeartBeat方式来检测用户的掉线情况. 心跳包实现思路 我们采用的思路 ...