【多线程-第一天-NSThread-互斥锁和自旋锁的区别-练习-异步下载网络图片 Objective-C语言】

一、互斥锁和自旋锁的区别

通知

1.刚刚我们看过了,互斥锁和自旋锁,下边我们来看,互斥锁和自旋锁的一个区别,

1)互斥锁:如果发现其他线程正在执行锁定代码,线程会进入休眠(就绪状态),等其他线程时间片到了,打开锁后,线程会被唤醒(执行)

它是被唤醒的,相当于什么呢,相当于你同桌,去厕所了,你也去厕所了,一敲门儿,你同桌在里边儿呢,这时候你跟同桌说:”我先回去了,等会儿你上完之后叫我“,哎,你先回来休息了,你同桌上完之后,会把门儿打开,回来叫你一声儿,你再去,你是不是就不用在门口儿一直站着了,

2)自旋锁:如果发现有其他线程正在锁定代码,有人占着那个坑儿呢,这个时候,你要去敲这个门儿,线程会用死循环的方式,不停的敲门儿,直到锁定的代码完成以后,这儿画了一个线程A正在执行这段儿代码呢,线程B就不停的敲门儿,不停的问“锁开了没有”,死循环,不停的去等待,

2.因为自旋锁的特点,它会不停的去等待,相当于是有一个循环,循环是非常消耗性能的,所以,我们自旋锁不适合锁住太多的代码儿,

自旋锁不适合锁住比较耗时的代码儿,锁住比较耗时的代码儿的话,等的时间会,特别长,

那你在循环,一直在循环,锁开了没有、锁开了没有、很烦人是吧,

非常的消耗性能,这是自旋锁啊,它不适合去执行非常耗时的操作,

所以一般情况下,就是属性,原子属性,用了一个自旋锁,

3.而互斥锁呢,任何位置,我们想锁住一段儿代码呢,你首先要想到的就是,互斥锁,

用互斥锁来做这件事情,这是互斥锁和自旋锁的区别,

二、其他

通知

1.线程安全:线程是不安全的,只要将来你用到了多线程,首先就要有一个概念,线程是不安全的,要想办法去保证线程的安全,

我们演示过一个,多个线程操作同一个全局变量的时候,

线程安全:在多个线程进行读写操作时,仍然能够保证数据的正确,

2.主线程(UI线程)

几乎所有UIKit提供的类都是线程不安全的,多个线程同时去操作的时候,可能会出现数据不一致的情况,所以我们要想办法去保证,我们多个线程同时去操作这些UI控件的时候,也要保证它的线程安全,因为这些类是线程不安全的,所以我要保证,在多线程操作它们的时候,是不是也要保证它们的数据是正确的,也要保证这个线程的安全,那怎么保证呢,

所有更新UI的操作都放在主线程执行,

为什么呢,因为你们是线程不安全的,如果我们多个线程,同时给一个Label去赋值,是不是可能会出现冲突,那怎么办呢,我们把这个操作都放到主线程上,我一个线程,是不是就是一个人,我给这个人分配5件事儿,这5件事儿它怎么执行,慢慢儿来,执行完一件,再执行另一件,

是不是不会出现同时这种情况,

所以,我们把所有更新UI的操作,都放在主线程上执行,保证这个线程安全,

所有包含Mutable的类,都是线程不安全的,

我们学过哪些包含Mutable的类,

NSMutableString、NSMutableArray、NSMutableDictionary、

这些类都是线程不安全的,什么是线程不安全的,多个线程同时对同一个MutableArray进行赋值的时候,不安全,可能会出现问题,我说的是可能,是一定吗,不一定,

有的时候可能是没有问题的,有的时候可能是有问题的,因为线程执行的过程是不确定的,

三、这块儿来做一个练习——异步下载网络图片

1.异步下载网络图片

通知

异步从网络上下载一张图片,显示到屏幕上来,下载一张大图,这张图片超过了屏幕的大小,超过我们这个手机屏幕的大小,所以要做拖动,让这个图片可以拖动,

拖动的话,需要什么控件儿,scrollView,

下载这么一张图片,

通知

这是网络上随便找的一张图片,

通知

新建一个项目,09-异步下载网络图片,

通知

为什么要异步下载网络图片呢,同步下不行吗,

同步会有什么问题呢,下载网络图片为什么要异步,而不同步,

同步下的慢,异步下载的也不快啊,都是这些资源,都是这个电脑,都是这个网络,

同步和异步下载的时间是一样的,

异步可以同时下载,我就开一个线程,我们大图,体积可能比较大,2-3M,网速有限,下载的速度可能比较慢,如果下载速度慢,是一个耗时操作,这个时候,界面会卡死,所以要异步下载,

2.我们创建好一个程序,我们要在这儿,放置一个scrollView,

通知

但是,在这个位置放scrollView,里面还得放一个imageView,

还要做屏幕适配,

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/35952.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【vue3 for beginner】Pinia基本用法:存储user的信息

🌈Don’t worry , just coding! 内耗与overthinking只会削弱你的精力,虚度你的光阴,每天迈出一小步,回头时发现已经走了很远。 📗概念 Pinia 简介 Pinia 是一个用于 Vue.js 应用的状态管理库,是 Vuex 的…

PS的功能学习(钢笔+...)

钢笔工具 转换点工具,就是按住alt就可以转换了,也不用特意去工具列表里找着点 弯度钢笔工具也是比较鸡肋的,钢笔工具熟练之后,控制的也会更精确,弯度虽然简化了,但是也增加了曲线的弯度限制 其他的功能&a…

论著和教材的区别是什么?

1、内容性质 论著: 内容以作者的研究成果和学术观点为主。它是作者在某一学科领域进行深入研究后,通过实验、调查、理论推导等方式得出的创新性见解。例如,在生物学论著中,作者可能通过长期的野外观察和基因分析,提出…

java环境配置

后端JAVA软件的记录下载 纯粹自己懒,有个记录后面换电脑换公司方便 1、java的下载 oracle.com 更详细的可以看这个 JDK1.8下载、安装和环境配置教程_jdk1.8下载与安装教程_KristenX的博客-CSDN博客 2、java中变量的定义 数据类型 名称 值 /java中8中数据变量 …

03、Node.js安装及环境配置

1.下载node.js 下载地址:Node.js 2.安装 2.1 自定义安装路径(可以选择默认) 下图根据本身的需要进行,我选择了默认Node.js runtime,然后Next: Node.js runtime :表示运行环境 npm package mana…

如何突破TikTok播放量零瓶颈

TikTok已成为全球最受欢迎的短视频平台之一,吸引了数亿用户。然而,许多新手创作者在上传视频后常常面临播放量为零的困境。这种情况让人感到困惑,尤其是在精心制作视频内容后,却没有得到预期的曝光和互动。那么,为什么…

基于SpringBoot+Vue框架的在线考试系统的设计与实现

基于SpringBootVue框架的在线考试系统的设计与实现 系统合集跳转 源码获取链接 一、系统环境 运行环境: 最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 IDE环境: Eclipse,Myeclipse,IDEA或者Spring Tool Suite都可以 tomcat环…

楼房销售系统设计与实现

文末获取源码和万字论文,制作不易,感谢点赞支持。 毕 业 设 计(论 文) 题目:楼房销售系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储&#xf…

King’s Biobank 生物样本库管理系统:高效、智能的样本管理解决方案

近年来,生物样本资源已成为生物医药产业和国家生物安全战略的核心基石,在病因研究、临床诊疗及疾病预防等多个关键领域发挥着不可替代的作用。然而,科研机构、检测中心和医院在样本管理方面普遍面临以下挑战: 重复记录&#xff0c…

spring下的beanutils.copyProperties实现深拷贝

spring下的beanutils.copyProperties方法是深拷贝还是浅拷贝?可以实现深拷贝吗? 答案:浅拷贝。 一、浅拷贝深拷贝的理解 简单说拷贝就是将一个类中的属性拷贝到另一个中,对于BeanUtils.copyProperties来说,你必须保…

Linux---对缓冲区的简单理解--第一个系统程序

前序: 首先先理解一下什么是回车与换行;回车和换行是两个概念,它们不是一个东西; 回车:光标回到开始;换行:换到下一行; 如下图: 行缓冲区 如何理解缓冲区问题? 可以认为&#xff0…

『RabbitMQ』 windows下 安装RabbitMQ 并在Python中使用测试

目录 1. 安装ERLANG2. 安装RabbitMQ3. 新建用户Python的测试代码 生产者和消费者总结欢迎关注 『RabbitMQ』 专栏,持续更新中 欢迎关注 『RabbitMQ』 专栏,持续更新中 1. 安装ERLANG 下载之前先看兼容性,这里我打算下载26.1版本的Erlang以适配RabbitMQ cloud.emqx.com/cons…

【教程】创建NVIDIA Docker共享使用主机的GPU

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 这套是我跑完整理的。直接上干货,复制粘贴即可! # 先安装toolkit sudo apt-get update sudo apt-get install -y ca-certifica…

麒麟信安受邀参加重庆教育装备专家培训会,共探教育信息化发展新趋势

近日,重庆市教育装备协会2024年区教育装备专家培训会举行,重庆各区教育信息技术与装备中心、教育委员会等相关领导参加。会上,麒麟信安作为协会成员单位发表主题演讲,与参会嘉宾深入探讨教育信息化工作的创新做法和实践经验&#…

2025澄迈漓岛音乐节品牌招商大会成功举行

——共谋音乐盛事,携手推动文化经济发展 12月6日,“2025澄迈漓岛音乐节品牌招商大会”(以下简称“招商大会”)在澄迈举行。本次大会由澄迈福山发展有限公司、福山咖啡文化风情镇旅游区联合主办,海南绿发投资有限公司承…

从零开始学TiDB(1) 核心组件架构概述

首先TiDB深度兼容MySQL 5.7 1. TiDB Server SQL语句的解析与编译:首先一条SQL语句最先到达的地方是TiDB Server集群,TiDB Server是无状态的,不存储数据,SQL 发过来之后TiDB Server 负责 解析,优化,编译 这…

调度算法的评价指标

调度算法的评价指标 一、CPU利用率二、系统吞吐量三、周转时间四、等待时间五、响应时间 一、CPU利用率 C P U 的利用率 C P U 有效工作时间 C P U 有效工作时间 C P U 空闲等待时间 CPU的利用率\dfrac{CPU有效工作时间}{CPU有效工作时间CPU空闲等待时间} CPU的利用率CPU有效…

【SpringBoot】SpringBoot中分页插件(PageHelper)的使用

目录 1.分页概念 2.原生写法 3.PageHelper插件分页查询 3.1 介绍 3.2?使用 3.3 Page对象和PageInf对象 1.分页概念 用户查询的数据不可能一次性全部展示给用户(如果用户有一万条数据呢),而是分页展示给用户,这就是分页查询…

python操作数据库

文章目录 基础使用数据插入 基础使用 python使用第三方库pymysql来操作mysql数据库 安装: pip install pymysqlfrom pymysql import Connection# 获取到MySQL数据库的链接对象conn Connection(hostlocalhost # 主机名,port3306 # 端口,默…

【01】栅格切片服务发布

本文探讨的是使用GeoScene Server本身的能力去切瓦片,它可以很好地通过server自带的CachingTools GP服务去切片,可以通过调整该gp服务的最大实例数能够更好利用server所在机器cpu的能力; 如果server站点已经发布了很多服务,则不建…