多线程安全(一)

先说说我遇到的多线程的两个问题:

事例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];既可以,当初切换主线程主要是为了业务外边的使用方便,但是没有想到带来了线程的问题,以后写线程的问题还得多想想。

由此可以总结下:

对于可变的容器,在多个线程中使用要谨慎,尽量把可变和使用都放在一个线程中。

在执行方法的时候,尽量不要阻塞某个线程,和切换线程,要让它在原来的线程中执行下去。非切换不可,要考虑周到些,因为以后的业务谁也说不清楚。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容