多執行緒安全(一)
先說說我遇到的多執行緒的兩個問題:
事例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];既可以,當初切換主執行緒主要是為了業務外邊的使用方便,但是沒有想到帶來了執行緒的問題,以後寫執行緒的問題還得多想想。
由此可以總結下:
對於可變的容器,在多個執行緒中使用要謹慎,儘量把可變和使用都放在一個執行緒中。
在執行方法的時候,儘量不要阻塞某個執行緒,和切換執行緒,要讓它在原來的執行緒中執行下去。非切換不可,要考慮周到些,因為以後的業務誰也說不清楚。
相關文章
- 多執行緒系列之 執行緒安全執行緒
- iOS 多執行緒之執行緒安全iOS執行緒
- iOS多執行緒之執行緒安全iOS執行緒
- 【Java多執行緒】執行緒安全的集合Java執行緒
- 【多執行緒總結(二)-執行緒安全與執行緒同步】執行緒
- Java 多執行緒基礎(四)執行緒安全Java執行緒
- iOS多執行緒安全-13種執行緒鎖?iOS執行緒
- 多執行緒應用初探(一)----(概念,安全)執行緒
- 小度分享-【多執行緒工作及執行緒安全】執行緒
- 多執行緒與高併發(二)執行緒安全執行緒
- 併發與多執行緒之執行緒安全篇執行緒
- 多執行緒(一)執行緒
- Java執行緒(一):執行緒安全與不安全Java執行緒
- 多執行緒,你覺得你安全了?(執行緒安全問題)執行緒
- 多執行緒學習一(多執行緒基礎)執行緒
- Java多執行緒(一)多執行緒入門篇Java執行緒
- 多執行緒系列(一):認識執行緒執行緒
- Java多執行緒中執行緒安全與鎖問題Java執行緒
- day20_多執行緒入門丶執行緒安全執行緒
- 多執行緒-以前的執行緒安全的類回顧執行緒
- GCD 多執行緒安全 單寫多讀GC執行緒
- [短文速讀 -5] 多執行緒程式設計引子:程式、執行緒、執行緒安全執行緒程式設計
- 多執行緒和多執行緒同步執行緒
- 多執行緒與高併發(一)多執行緒入門執行緒
- Java多執行緒學習(一)Java多執行緒入門Java執行緒
- 多執行緒【執行緒池】執行緒
- 多執行緒--執行緒管理執行緒
- Java多執行緒——執行緒Java執行緒
- 執行緒與多執行緒執行緒
- 多執行緒安全strtok函式MStrTok執行緒函式
- VC多執行緒 C++ 多執行緒執行緒C++
- 畫江湖之 PHP 多執行緒開發 【執行緒安全 互斥鎖】PHP執行緒
- 畫江湖之 PHP 多執行緒開發 [執行緒安全 互斥鎖]PHP執行緒
- 多執行緒-執行緒控制之休眠執行緒執行緒
- 多執行緒-執行緒控制之加入執行緒執行緒
- 多執行緒-執行緒控制之禮讓執行緒執行緒
- 多執行緒-執行緒控制之中斷執行緒執行緒
- JavaSE_多執行緒入門 執行緒安全 死鎖 狀態 通訊 執行緒池Java執行緒