[英]Static member variable and thread safety
我正在开发一个 ASP.NET MVC 应用程序。
我有一个 ViewModel class 我试图维护一个计数以生成视图中使用的 div id:
public class ViewModel {
private static uint instanceCount;
private readonly uint id;
public ViewModel(){
id = instanceCount++;
}
public uint DivId
{
get { return id; }
}
}
我是否正确地考虑递增和分配 static 成员不是线程安全的,因此在 web 应用程序中不安全?
确保安全的最佳方法是什么?
谢谢。
我是否正确地考虑递增和分配 static 成员不是线程安全的,因此在 web 应用程序中不安全?
是的,你的想法是正确的。
确保安全的最佳方法是什么?
通过同步访问:
public class ViewModel
{
private static uint instanceCount;
private readonly uint id;
private static object _syncRoot = new object();
public ViewModel()
{
lock(_syncRoot)
{
id = instanceCount++;
}
}
public uint DivId
{
get { return id; }
}
}
或者干脆使用Guid :
public class ViewModel
{
public ViewModel
{
DivId = string.Format("id_{0}", Guid.NewGuid());
}
public string DivId { get; private set; }
}
我不得不问,为什么你不能在你的视野中处理这个:
public ActionResult Index() {
var models = SomeService.GetModels(); // returns IEnumerable<YourViewModel>
return View(models);
}
// in your view
@for (int i = 1; i == Model.Count(); i++) {
<div id="div-@i">
<!-- your content here -->
</div>
}
您可以改用Interlocked.Increment 。 但是,这仅适用于签名的 integer。
您可以使用System.Threading.Interlocked.Increment()
方法。 在您的情况下,这将是正确的选择。 有关详细信息,请参阅 联锁 class 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.