一、线程的状态有哪些:
![](https://img.haomeiwen.com/i4752127/3c5467f9ba7a0a93.png)
注:此图来源于我正在学习的vip课程(潭州课程)。很不错,大家可参去看看(毕竟用了人家东西,打个广告,请大家理解)。
从上图可以看出来,线程有五种状态,并且运行状态是我们不能控制的,只能等着CPU去调度。
二、原子和非原子属性
我们在声明一个属性的时候,通常定义为nonatomic,而不使用atomic,为什么呢?他们分别是什么意思呢?
atomic:原子属性,为setter方法加锁(默认就是atomic)
nonatomic:非原子属性,不会为setter方法加锁
nnonatomic和atomic对比:
1> atomic:线程安全,需要消耗大量的资源
2> nonatomic:非线程安全,适合内存小的移动设备
原子属性内部就有一把锁称作 “自旋锁”(知识点来自潭州课堂)
那么自旋锁和互斥锁(@synchronized)的共同点和区别是什么呢?
- 共同点
都能保证同一个时间点就只有一条线程访问!
- 不同点
互斥锁:如果发现有其他线程正在执行锁定的代码,线程就会进入睡眠状态,等待其他线程执行完毕,打开锁之后,线程就会被唤醒!
自旋锁:如果发现有其他线程正在执行锁定的代码,线程就会用死循环的方式,一直等待锁定代码执行完毕!
无论什么锁,都是以"性能"作为代价来保证"安全"
三、线程间通信
概念就不写了,大家想必都知道,我就简单说下通信常用的方法有哪些(其实也没必要写,不过我很执着,哈哈):
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait;
这是常用的方法,也许不太全面,大家可以补充。
接下来我们将一起探讨牛逼的GCD和NSOperation,好不好,好不好?答理是 好 好 好。
网友评论