class Program
{
public static List<string> list = new List<string>();
static void Main(string[] args)
{
Thread td = new Thread(new ThreadStart(DO));
td.Start();
Thread td1 = new Thread(new ThreadStart(DO1));
td1.Start();
Console.ReadLine();
}
private static void DO()
{
for (int i = 0; i < 100; i++)
{
list.Add(i.ToString());
}
}
private static void DO1()
{
for (int i = 0; i < 100; i++)
{
list.Add(i.ToString());
}
}
}
为什么list只有一百个数据..还有请高手讲讲什么是线程不安全???
1:list最终会有200个数据,你需要点时间让它执行完。
2:线程安全,主要是两个或多个线程并发访问同个对象导致的一些问题。
都有可能,也有可能200 。 你多测试几次。或者加一个sleep(1000) 等个1s中,然后在监测看看。 线程不安全 其实这里边也已经体现了的, 你调用第一个线程的时候,list里加100个数据在这个的时候下面那个线程也开始跑了。也会向list中添加数据,那么在你上面的一个线程的方法中如果继续使用那个list的话,就可能出现了意料之外的结果。
同时用多个线程往一个列表中添加对象会出现这种情况。考虑使用Lock语句锁定资源,http://msdn.microsoft.com/en-us/library/c5kehkcz(v=vs.110).aspx
结果应该是不固定的吧,可能每次跑完list的集合长度都不一定。
这里的线程不安全是指在同一时刻多个线程对同一共享资源进行读写操作,
你开了两个子线程,当你Main方法跑到Console.ReadLine();时。线程可能执行完了,也可能还没start。所以跑到Console.ReadLine()时。list这个集合可能还没有加完,所以list数据不固定。你可以在Console.ReadLine()前sleep(1000) 让子线程跑完。这时候看list 就是200 了。
因为两个线程对同一个对象进行操作。这里是td对list进行add。同时td1也会对list进行add。所以你不知道某一时刻,到底是谁做add。
一、Code中的list对象是线程安全的。请查阅关于List(T)的MSDN官方帮助文档解释如下:LIST(T)此类型的公共静态(在 Visual Basic 中为 Shared)成员是线程安全的。 但不能保证任何实例成员是线程安全的。
在这里线程安全的意思就是对于写操作 只有一个线程占用资源(list)
二、明确一共三个线程即(1)主线程(Main)--食客 (2)线程td--厨师甲 (3)线程td1---厨师乙 list---盘子
厨师甲的行为是在盘子里加一百个饼
厨师乙的行为也是在盘子里加一百个饼
食客的动作是数盘子里的饼
线程安全:盘子要么在厨师甲那里,要么是在厨师乙那里,要么是在食客那里。反正他们三个不能同时用盘子。
这样就是先六种情况
1、厨师甲先拿到盘子,然后执行动作,然后把盘子给乙,然后乙放盘子里一百个饼。然后食客再数胖子里的饼。这时候的结果是200。
2、厨师乙。。。然后厨师甲。。。然后食客。。。200个饼
3、食客。。。厨师乙。。。然后厨师甲。。0个饼
4、食客。。。厨师甲。。。然后厨师乙。。0个饼
5、甲。。。食客。。。乙。。。100个
6、乙。。。食客。。。甲。。。100个
所以结果是可以计算出来的即 0,100,200
三、与线程安全对应的,非线程安全
厨师甲在加饼的过程中,厨师乙去拿盘子,后来两人打起来了(报错)尼玛。。。。
四、你看我打这么多字没有功劳也有苦劳。多给点分吧。