首先说到多线程脑海里浮现的是NSThread 和 GCD,然后呢NSThread虽然听说了很多,自己却没什么用过。那就先从这两个入手分析分析吧。
1, NSThread 周期
1)NSThread的创建 : NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(threadDemo) object:nil];
2)就绪, 将线程放进可调度线程池,等待被CPU调度:[thread start];
3)运行, CPU负责调度"可调度线程池"中的处于"就绪状态"的线程,结束之前状态有可能从就绪和运行两个状态自由切换,该过程又CPU决定
4)阻塞, 正在运行的线程,当满足某个条件时,可以用休眠或者锁来阻塞线程的执行:[NSThread sleepForTimeInterval:1.0];
5)死亡, 要不程序崩溃,要不自己写代码 [NSThread exit];
2,简单的说完了,现在说复杂的了。关于锁
当两个线程读取修改同一个资源的时候呢,可以用@synchronized这个互斥锁,表示我这个资源正在使用哦,等我运行完了你再用,这样就不会有脏数据的产生。可是这样也会运行慢一点,牺牲了性能保证了安全性。
3,nonatomic和atomic 其实一直都不理解为什么会有这两个东西,然后网上的解析永远都是atomic 是线程安全的,可是太慢,nonatomic 是线程不安全的,效率很高,一般都用这个,然后呢,然后就没然后。今天多看了一点atomic 的知识,让我感觉atomic 很像一个加了互斥锁的nonatomic一样,保证我这个属性在用的时候别人不能用,所以线程安全。然后网上说atomic是单写多读的,意思是写的话就互斥,读的时候就可以一起读。类似:A:我在写进去 B:哦,那我等你写完吧。A:我在读这个耶 B:来来来,那我们一起。就是这样的道理了嘛。
atomic 其实是自带自旋锁的,然后什么是自旋锁呢?那:
互斥锁和自旋锁对比
共同点:
都能够保证同一时间,只有一条线程执行锁定范围的代码
不同点:
互斥锁:如果发现有其他线程正在执行锁定的代码,线程会进入休眠状态,等待其他线程执行完毕,打开锁之后,线程会重新进入就绪状态.等待被CPU重新调度.
自旋锁:如果发现有其他线程正在执行锁定的代码,线程会以死循环的方式,一直等待锁定代码执行完成.
4,说了那么多乱七八糟的,居然还不说GCD,好吧,马上来说。