首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使线程安全而不是线程安全

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

Stack Overflow用户
提问于 2017-08-19 07:12:04
回答 1查看 101关注 0票数 1

我有这个代码,如果它是线程安全与否,我会惊奇!

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

代码语言:javascript
复制
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; }
}
}

理解这个概念是很复杂的,谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-19 07:33:05

您的代码是线程安全的,因为没有共享状态(即不同的线程不共享同一个对象)。唯一的“共享性”是对Console.WriteLine的调用,即螺纹安全

作为如何使其不线程安全的一个示例,请更改:

代码语言:javascript
复制
static void method( User user)
{
    Console.WriteLine($@"the {user.Id} is {user.Id}{user.Id}");
}

至:

代码语言:javascript
复制
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代码可能仍然可以有时工作-但它不能保证工作(如果您运行足够长的时间,肯定会失败)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45768797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档