先說說我遇到的多線程的兩個問題:
事例1:有一個NSMutableArray 的實例變量 mutableA沐序。在線程A中修改mutableA,在主線程中使用mutableA堕绩,且還是在用在tableview上策幼。出現(xiàn)問題,如果之前的mutableA有5個元素奴紧,那么tableview 就有5行特姐,但是如果在創(chuàng)建tableview的時候,mutableA被線程A修改黍氮,元素個數(shù)變?yōu)?個唐含,那么在代理創(chuàng)建tableview的時候會出現(xiàn)數(shù)組越界,那就會出現(xiàn)crash沫浆。
事例2:
代碼A:
-(void)criticalMethod
{
? ? @synchronized(self)
? ? {
? ? ? ? ? ? ?//關(guān)鍵代碼;
? ? }
}
代碼B:
- (void)testMethod
{
if (![[NSThread currentThread] isMainThread]) {
? ? [target performSelectorOnMainThread:action withObject:tempParaDic ? ? ? ? ? waitUntilDone:YES];
}
}
在主線程中調(diào)用A捷枯,在A中切換到線程1,在1中調(diào)用代碼B专执。因為B中要阻塞線程1淮捆,等待主線程執(zhí)行完;此時的主線程在等待線程1,所以形成死鎖争剿,循環(huán)等待已艰。
對于問題一的修改:把對可變數(shù)組的修改放到主線程中去就可以了。
對于問題二的修改:把代碼B中的代碼換成[targetperformSelector:actionwithObject:tempParaDic];既可以蚕苇,當初切換主線程主要是為了業(yè)務(wù)外邊的使用方便哩掺,但是沒有想到帶來了線程的問題,以后寫線程的問題還得多想想涩笤。
由此可以總結(jié)下:
對于可變的容器嚼吞,在多個線程中使用要謹慎,盡量把可變和使用都放在一個線程中蹬碧。
在執(zhí)行方法的時候舱禽,盡量不要阻塞某個線程,和切換線程恩沽,要讓它在原來的線程中執(zhí)行下去誊稚。非切換不可,要考慮周到些罗心,因為以后的業(yè)務(wù)誰也說不清楚里伯。