先说说我遇到的多线程的两个问题:
事例1:有一个NSMutableArray 的实例变量 mutableA。在线程A中修改mutableA,在主线程中使用mutableA,且还是在用在tableview上。出现问题,如果之前的mutableA有5个元素,那么tableview 就有5行,但是如果在创建tableview的时候,mutableA被线程A修改,元素个数变为3个,那么在代理创建tableview的时候会出现数组越界,那就会出现crash。
事例2:
代码A:
-(void)criticalMethod
{
@synchronized(self)
{
//关键代码;
}
}
代码B:
- (void)testMethod
{
if (![[NSThread currentThread] isMainThread]) {
[target performSelectorOnMainThread:action withObject:tempParaDic waitUntilDone:YES];
}
}
在主线程中调用A,在A中切换到线程1,在1中调用代码B。因为B中要阻塞线程1,等待主线程执行完;此时的主线程在等待线程1,所以形成死锁,循环等待。
对于问题一的修改:把对可变数组的修改放到主线程中去就可以了。
对于问题二的修改:把代码B中的代码换成[targetperformSelector:actionwithObject:tempParaDic];既可以,当初切换主线程主要是为了业务外边的使用方便,但是没有想到带来了线程的问题,以后写线程的问题还得多想想。
由此可以总结下:
对于可变的容器,在多个线程中使用要谨慎,尽量把可变和使用都放在一个线程中。
在执行方法的时候,尽量不要阻塞某个线程,和切换线程,要让它在原来的线程中执行下去。非切换不可,要考虑周到些,因为以后的业务谁也说不清楚。