作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
根据我目前的理解,我认为这段代码不是线程安全的,但想确认一下。换句话说,我认为,虽然这极不可能,但表示不同 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/
我是一名优秀的程序员,十分优秀!