您的位置:首页 > 其它

一个多线程例子

2012-07-22 00:04 127 查看
问题源自http://topic.csdn.net/u/20120721/22/e3b8af77-dbe7-4e71-96af-1831508e09fa.html#replyachor

在14楼的回复
var c=s;应该是创建一个c引用地址到s指向的堆中,s的引用地址改变,c应该是不会改变的,但这种写法结果还是和lz的一样,有些不解了。
这个是自己测试写出了问题。实际上还是创建一个c引用地址到s指向的堆中
三种解决办法。

public class Test
{
public int volume { set; get; }

public string name { set; get; }
}
class Program
{
private static object lockObj = new object();

static void Main(string[] args)
{
List<Test> list = new List<Test>();
for (int i = 0; i < 5; i++)
{
Test data = new Test();
data.name = i.ToString();
list.Add(data);
}

//第一种
//foreach (Test item in list)
//{
//    Test data = item;
for (int i = 0; i < list.Count; i++)
{
//第二种
//Test data;
//lock (lockObj)
//{
//    data = list[i];
//}

//第三种
Test data = list[i];
new Thread(() =>
{
for (int j = 0; j < 2000000; j++)
{
data.volume++;
}
}).Start();
}

int total = 0;
foreach (Test item in list)
{
total += item.volume;
Console.WriteLine(item.name + "--" + item.volume);
}
Console.WriteLine("总数:" + total.ToString());

Thread.Sleep(2000);
int total2 = 0;
foreach (Test item in list)
{
total2 += item.volume;
Console.WriteLine(item.name + "--" + item.volume);
}
Console.WriteLine("总数:" + total2.ToString());
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: