網上關於list的執行緒安全問題將的很少,所以自己實驗了一把,發現確實是執行緒不安全的.所以當你在進行多執行緒程式設計中使用了共享的list集合,必須對其進行執行緒安全處理.
list的add方法是執行緒不安全的,list的原始碼中的add方法,使用了每次當當前的元素達到上限,通過建立乙個新的陣列例項,並給長度翻倍的操作.如果單執行緒操作不會有問題,直接擴容,然後繼續往裡面加值。下面是list的add方法和核心邏輯.
也就是說,當多個執行緒同時新增元素,且剛好它們都執行到了擴容這個階段,當乙個執行緒擴大了這個陣列的長度,且進行了+1操作後,另外乙個執行緒剛好也在執行擴容的操作,這個時候它給capacity的值設為2048,但是另外乙個執行緒已經將this._size設為2049了,所以這個時候就報異常了.當然不止這乙個問題,還有copy的時候也會出問題,如果裡面的元素過多,另外乙個執行緒拿到空值的機率很大.
**重現:
多跑幾次這段**,你幾乎可以重現所有可能出現的多執行緒資源爭用異常.
解決方案:給add方法加鎖,**如下:
classok,解決了問題,當然這不是最好的解決方案,你完全可以通過介面卡模式,去擴充套件乙個執行緒安全的list型別,這裡我就不寫了.program
;var tftask=tf.continuewhenall(childtasks, completedtasks => completedtasks.where(w => !w.isfaulted && !w.iscanceled), taskcontinuationoptions.none);
tftask.continuewith(task=>);
});console.readkey();
}static
void
task_0()}}
static
void
task_1()}}
static
void
task_2()}}
}
Java多執行緒之執行緒安全
當多個執行緒訪問某乙個類 物件或方法時 這個類始終都能表現出正確的行為,那麼這個類 物件或方法 就是執行緒安全的。public class mythread extends thread public static void main string args 結果如下 t1正在執行 4 t1正在執行...
多執行緒之執行緒安全問題
講到執行緒安全 enn。怎麼說呢 這是乙個很複雜的東西 算了直接上 吧 文章中 有些我也是複製的不過我不像別人看都不看 我都看過一邊覺得對的我才會複製 public class securitythead public static void main string args catch inter...
C 多執行緒 執行緒安全
當使用多執行緒時,可能存在同時訪問乙個變數,導致變數被汙染問題,所以需要通過程式設計克服這個問題。採用多個執行緒,分別記數,然後檢視最終計算結果,如下 include include include 計數全域性變數 long cnt 0 計數程式 void counter int main int ...