繁体   English   中英

Static 成员变量和线程安全

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM