假設(shè)多個線程共享一個靜態(tài)變量,如果讓每個線程都執(zhí)行相同的方法每次讓靜態(tài)變量自增1,這樣的做法線程安全嗎?能保證自增變量數(shù)據(jù)同步嗎?本篇體驗使用lock語句塊和Interlocked類型方法保證自增變量的數(shù)據(jù)同步。
□ 線程不安全、數(shù)據(jù)不同步的做法
class PRogram{static int sum = 0;static void Main(string[] args){Stopwatch watch = new Stopwatch();watch.Start();Parallel.For(0, Environment.ProcessorCount, i =>{for (int j = 0; j < 100000000; ++j){AddOne();}});watch.Stop();Console.WriteLine("sum={0},用了{1}", sum, watch.Elapsed);Console.ReadKey();}static void AddOne(){sum++;}}
○ 變量sum是靜態(tài)的,供所有線程共享○ Parallel.For提供并行循環(huán), Environment.ProcessorCount表示處理器的處理,如果有4個CPU,就做4組循環(huán)
![]()
我們發(fā)現(xiàn),結(jié)果不是我們期望的400000000,也就是說,在這種情況下的靜態(tài)變量自增不是線程安全的,換句話說,無法保證共享數(shù)據(jù)的同步。
□ 通過lock語句塊保持數(shù)據(jù)同步
class Program{static int sum = 0;private static readonly object o = new object();static void Main(string[] args){Stopwatch watch = new Stopwatch();watch.Start();Parallel.For(0, Environment.ProcessorCount, i =>{for (int j = 0; j < 100000000; ++j){AddOne();
新聞熱點
疑難解答