多執行緒安全(一)

weixin_33924312發表於2016-09-20

先說說我遇到的多執行緒的兩個問題:

事例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];既可以,當初切換主執行緒主要是為了業務外邊的使用方便,但是沒有想到帶來了執行緒的問題,以後寫執行緒的問題還得多想想。

由此可以總結下:

對於可變的容器,在多個執行緒中使用要謹慎,儘量把可變和使用都放在一個執行緒中。

在執行方法的時候,儘量不要阻塞某個執行緒,和切換執行緒,要讓它在原來的執行緒中執行下去。非切換不可,要考慮周到些,因為以後的業務誰也說不清楚。

相關文章