我有这个代码,我想知道它是否是线程安全的!!
如果它是线程安全的,如何使它不安全,反之亦然
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; }
}
}
理解这个概念很复杂 感谢
答案 0 :(得分:2)
您的代码是线程安全的,因为没有共享状态(即不同的线程不共享同一个对象)。唯一的共享&#39;是对Console.WriteLine
的调用thread-safe。
作为如何使其不是线程安全的示例,请更改:
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
是not thread-safe。
请注意,上述list.Add
代码可能仍然有时工作 - 但保证无法正常工作(并且肯定会如果运行时间太长就会失败。