gpt4 book ai didi

c# - 此代码线程在 ASP.NET MVC 4 中是否安全?

转载 作者:行者123 更新时间:2023-12-03 12:49:10 26 4
gpt4 key购买 nike

根据我目前的理解,我认为这段代码不是线程安全的,但想确认一下。换句话说,我认为,虽然这极不可能,但表示不同 HTTP 请求的多个线程可能会混淆 _userName 属性的值。

public class SomeClass
{
private static string _userName;

public static string UserName
{
get
{
if (string.IsNullOrEmpty(_userName))
{
_userName = HttpContext.Current.User.Identity.Name;
}

return _userName;
}
}
}

它是线程安全的吗?如果不是,是否会删除 null 检查,并始终直接(在静态属性中)访问 HttpContext.Current.User.Identity.Name 是线程安全的?

public class SomeClass
{
public static string UserName
{
get
{
return HttpContext.Current.User.Identity.Name;
}
}
}

最佳答案

你的两个例子非常不同。你是对的,你的第一个例子不是线程安全的,但更重要的问题是它不是 session 安全的。访问 UserName 的第一个 session 将设置用户名,所有其他 session 将使用相同的名称!在应用程序池被回收之前,UserName 不会改变。如果 技术上 第二个 session 在第一个 session 之后发出请求,设置用户名是否重要?

如果要为每个 session 缓存用户名,请使用 Session 属性:

Session["UserName"] = HttpContext.Current.User.Identity.Name;

第二个 block 线程安全的,但它每次调用时都会返回当前用户名。因此无需担心数据跨线程,更不用说 session 了。

关于c# - 此代码线程在 ASP.NET MVC 4 中是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28618675/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com