c#线程基础之原子操作2011-07-04 csdn博客 jinjazz使用System.Threading.Interlocked类可以提高线程的安全性,具体资料参考msdn: http://msdn.microsoft.com/zh-cn/library/system.threading.interlocked.aspx 一般情况下,在子线程内使用i++这样的方式访问全局变量的方式是不安全的做法。测试下面的代码,在test1中经过100次number++,number并没有每次从0变为100,而test2则没有问题。
01.using System;
02.
03.using System.Windows.Forms;
04.
05.namespace WindowsApplication32
06.
07.{
08.
09.public partial class Form1 : Form
10.
11.{
12.
13.public Form1()
14.
15.{
16.
17.InitializeComponent();
18.
19.}
20.
21.int number = 0;
22.
23.
24.
25./// <summary>
26.
27./// 普通的变量访问方式
28.
29./// </summary>
30.
31.private void test1()
32.
33.{
34.
35.for (int m = 0; m < 10; m++)
36.
37.{
38.
39.number++;
40.
41.System.Threading.Thread.Sleep(100);
42.
43.}
44.
45.Console.WriteLine(number);
46.
47.}
48.
49.private void button1_Click(object sender, EventArgs e)
50.
51.{
52.
53.number = 0;
54.
55.for (int i = 0; i < 10; i++)
56.
57.{
58.
59.new System.Threading.Thread(test1).Start();
60.
61.}
62.
63.}
64.
65./// <summary>
66.
67./// 使用原子的访问方式
68.
69./// </summary>
70.
71.private void test2()
72.
73.{
74.
75.for (int m = 0; m < 10; m++)
76.
77.{
78.
79.System.Threading.Interlocked.Increment(ref number);
80.
81.System.Threading.Thread.Sleep(100);
82.
83.}
84.
85.Console.WriteLine(number);
86.
87.}
88.
89.private void button2_Click(object sender, EventArgs e)
90.
91.{
92.
93.number = 0;
94.
95.for (int i = 0; i < 10; i++)
96.
97.{
98.
99.new System.Threading.Thread(test2).Start();
100.
101.}
102.
103.}
104.
105.}
106.
107.}