如何使线程安全而不是线程安全

时间:2017-08-19 07:12:04

标签: c# multithreading static thread-safety

我有这个代码,我想知道它是否是线程安全的!!

如果它是线程安全的,如何使它不安全,反之亦然

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; }
}
}

理解这个概念很复杂 感谢

1 个答案:

答案 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.Addnot thread-safe

请注意,上述list.Add代码可能仍然有时工作 - 但保证无法正常工作(并且肯定会如果运行时间太长就会失败。

相关问题