一、互斥锁和自旋锁的区别 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, 还要做屏幕适配,