我有这个代码,如果它是线程安全与否,我会惊奇!
如果它是线程安全的,那么如何使它不安全,反之亦然。
namespace ThreadSafeTest
{
class Program
{
static void Main(string[] args)
{
Task.Factory.StartNew(() =>
{
for (int i = 0; i < 1000; i++)
{
var user = new User() { Id = i };
method(user);
}
});
Task.Factory.StartNew(() =>
{
for (int i = 1000; i < 2000; i++)
{
var user = new User() { Id = i };
method(user);
}
});
Console.ReadLine();
}
static void method( User user)
{
Console.WriteLine($@"the {user.Id} is {user.Id}{user.Id}");
}
}
public class User
{
public int Id { get; set; }
}
}理解这个概念是很复杂的,谢谢
发布于 2017-08-19 07:33:05
您的代码是线程安全的,因为没有共享状态(即不同的线程不共享同一个对象)。唯一的“共享性”是对Console.WriteLine的调用,即螺纹安全。
作为如何使其不线程安全的一个示例,请更改:
static void method( User user)
{
Console.WriteLine($@"the {user.Id} is {user.Id}{user.Id}");
}至:
private static List<User> list = new List<User>();
static void method( User user)
{
list.Add(user);
Console.WriteLine($@"the {user.Id} is {user.Id}{user.Id}");
}因为list.Add是非线程安全。
请注意,上面的list.Add代码可能仍然可以有时工作-但它不能保证工作(如果您运行足够长的时间,肯定会失败)。
https://stackoverflow.com/questions/45768797
复制相似问题