廢話不多說,上**:
using system;
using system.collections.generic;
using system.threading.tasks;
namespace paralleltest
);
console.writeline(products.count);
console.readline();}}
class product
public string category
public int sellprice }}
猜一下,執行結果是多少,是999999?抱歉不是的,結果!= 999999。
net 4.0引入了system.threading.tasks,簡化了我們進行非同步程式設計的方式,而不用直接與執行緒和執行緒池打交道,但這也引入了執行緒安全問題。
system.threading.tasks中的型別被稱為任務並行庫(tpl)。tpl使用clr執行緒池(說明使用tpl建立的執行緒都是後台執行緒)自動將應用程式的工作動態分配到可用的cpu中。
其中parallel是指資料並行,其提供的parallel.for()或parallel.foreach()方法,可以以並行方式對陣列或集合中的資料進行迭代。
那之所以出現這個結果,很顯然了,是多執行緒操作集合導致的執行緒安全問題。
總之,多執行緒操作集合時一定要注意執行緒安全的問題,不管是通過thread、threadpool、task、parallel還是plinq。
解決方案很簡單:
加鎖使用並行集合(system.collections.concurrent)
對於這個問題,我知道其存在潛在的執行緒安全問題,但是不確定其導致的結果如何?當我截圖到處詢問無果時,才想到自己動手寫demo去驗證問題。這也是我寫這篇文章的初衷:提醒自己,遇到問題,不要憑空猜測,要有動手驗證的決心。
執行緒安全問題
執行緒安全問題導致的原因 當多條語句在操作同乙個執行緒共享資料時,乙個執行緒對多條語句只執行了一部分,還沒有徹底執行完畢,此時另乙個執行緒參與進來執行,導致共享資料的錯誤。執行緒安全解決辦法 對多條操作共享的語句,每次只能讓乙個執行緒執行完成。在執行的過程中,其他執行緒不可以參與執行。解決方案 同步...
執行緒安全問題
是指 在多個執行緒進行的情況下對全域性變數或靜態變數進行寫的操作的時候出現的資料上的問題,就是執行緒安全的問題,在讀的時候不會出現執行緒的問題 即 public void run catch interruptedexception e synchronized this 即 package com...
執行緒安全問題
由於cpu輪流切換執行緒導致某執行緒沒來的及執行完,執行緒的共享變數便直接被其他執行緒所修改。package 執行緒安全問題 public class mainclass2 class ticket extends threadcatch interruptedexception e system....