一、多线程的目的:将耗时的操作放在后台,不阻塞主线程和用户交互!
优点:通过并发提高程序的执行效率。
二、调度优先级:取值范围0.0~1.0,默认0.5,值越大优先级越高;优先级只是保证CUP调度的可能性会高,不会保证每次都先执
行(在开发中不建议修改优先级,可能会出现优先级反转,最下面会写)。
三、多线程安全隐患
资源共享:一块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源,当多个线程访问同一块资源时,很容易引发数据错乱和数据安全问题。
解决办法:互斥锁@synchronized(参数){ ...需要加锁的代码 };使用前提:多条线程抢夺同一块资源。互斥锁使用了线程同步技术
互斥锁:保证锁内的代码同一时间只有一条线程能够执行。互斥锁的锁定范围应该尽量小,锁定范围越大,效率越差。
参数:能够加锁的任意NSObject对象,注意:锁一定要是所有的线程共享的对象!局部变量是每一个线程单独拥有的因此无法枷锁
如果代码中只有一个地方需要加锁,一般使用self
优点:能有效防止因多线程抢夺资源造成的数据安全问题
缺点:需要消耗大量的CPU资源
四、原子和非原子属性
OC在定义属性时有nonatomic和atomic两种选择
atomic:原子属性,为setter方法加锁(默认就是atomic)
nonatomic:非原子属性,不会为setter方法加锁
atomic加锁原理
@property (assign, atomic) int age; - (void)setAge:(int)age{ @synchronized(self) { _age = age; } }
atomic:线程安全,需要消耗大量的资源
nonatomic:非线程安全,适合内存小的移动设备
iOS开发的建议:1.所有属性都声明为nonatomic 2.尽量避免多线程抢夺同一块资源
3.尽量将加锁、资源抢夺的业务逻辑交给服务器端处理,减小移动客户端的压力
注:优先级反转是指一个低优先级的任务持有一个被高优先级任务所需要的共享资源。高优先任务由于因资源缺乏而处于受阻状态,一直等到低优先级任务释放资源为止。而低优先级获得的CPU时间少,如果此时有优先级处于两者之间的任务,并且不需要那个共享资源,则该中优先级的任务反而超过这两个任务而获得CPU时间。如果高优先级等待资源时不是阻塞等待,而是忙循环,则可能永远无法获得资源,因为此时低优先级进程无法与高优先级进程争夺CPU时间,从而无法执行,进而无法释放资源,造成的后果就是高优先级任务无法获得资源而继续推进。
传送门1:http://blog.chinaunix.net/uid-25147458-id-3408682.html
传送门2:http://www.blogjava.net/killme2008/archive/2009/06/28/284459.html