在.net面向對象程序設計階段在線程資源共享中的線程安全和線程沖突的解決方案;多線程同步,使用線程鎖和線程通知實現線程同步,具體內容介紹如下:
1、 ThreadStatic特性
特性:[ThreadStatic]
功能:指定靜態字段在不同線程中擁有不同的值
在此之前,我們先看一個多線程的示例:
我們定義一個靜態字段:
static int num = 0;
然后創建兩個線程進行分別累加:
- new Thread(() =>
- {
- for (int i = 0; i < 1000000; i++)
- ++num;
- Console.WriteLine("來自{0}:{1}", Thread.CurrentThread.Name, num);
- })
- { Name = "線程一" }.Start();
- new Thread(() =>
- {
- for (int i = 0; i < 2000000; i++)
- ++num;
- Console.WriteLine("來自{0}:{1}", Thread.CurrentThread.Name, num);
- })
- { Name = "線程二" }.Start();
運行多次結果如下:
可以看到,三次的運行結果均不相同,產生這種問題的原因是多線程中同步共享問題導致的,即是多個線程同時共享了一個資源。如何解決上述問題,最簡單的方法就是使用靜態字段的ThreadStatic特性。
在定義靜態字段時,加上[ThreadStatic]特性,如下:
不論運行多少次,結果都是一樣的,當字段被ThreadStatic特性修飾后,它的值在每個線程中都是不同的,即每個線程對static字段都會重新分配內存空間,就當然于一次new操作,這樣一來,由于static字段所產生的問題也就沒有了。
2. 資源共享
多線程的資源共享,也就是多線程同步(即資源同步),需要注意的是線程同步指的是線程所訪問的資源同步,并非是線程本身的同步。
在實際使用多線程的過程中,并非都是各個線程訪問不同的資源。
下面看一個線程示例,假如我們并不知道線程要多久完成,我們等待一個固定的時間(假如是500毫秒):
先定義一個靜態字段:
static int result;
創建線程:
- Thread myThread = new Thread(() =>
- {
- Thread.Sleep(1000);
- result = 100;
- });
- myThread.Start();
- Thread.Sleep(500);
- Console.WriteLine(result);
新聞熱點
疑難解答
圖片精選