有没有重写可以使这个c#类线程安全?

ant*_*tfx 6 c# multithreading

我喜欢在C#中创建类的快速方法,我们可以轻松地创建成员而无需实现get和set代码,但(据我所知)它们不是线程安全的!

public class SocksEntry
{
    public int Int1 { get; set; }
    public int Int2 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

C#是否提供了一种快速简单的方法来增加线程安全性而无需这样做?

public class SocksEntry
{
    protected object _lock = new object();

    // internal
    private int _int1 = 0;
    private int _int2 = 0;

    // accessors
    protected int Int1
    {
        get { lock (_lock) return _int1; }
        set { lock (_lock) _int1 = value; }
    }

    protected int Int2
    {
        get { lock (_lock) return _int2; }
        set { lock (_lock) _int2 = value; }
    }
}
Run Code Online (Sandbox Code Playgroud)

与非线程安全版本相比,它显然使整个类更大,创建更痛苦!

Dar*_*rov 7

使类线程安全比你想象的要困难得多.将锁定放在getter和setter周围可能是不够的.因此,最佳做法是让类不是线程安全的,并且如果他需要线程安全,则将责任留给此类的使用者以同步对它的访问.如果消费者不需要线程安全,那么很好,你不会因为你在没有需要的情况下将线程安全性构建到类中而惩罚应用程序的性能.为什么你认为.NET中99.99%的类不是线程安全的?

  • 我当然可以.你所要做的就是摆脱前面提到的例子中的锁.看一下OP提供的第一个代码片段.这就是大多数情况下课程的样子.至于以线程安全的方式使用这个类,这完全取决于上下文.OP没有真正指定如何使用这个类,所以没有这个就提供具体的例子有点困难. (2认同)
  • 线程安全解决方案是什么?OP没有对这个问题提出任何背景.他没有解释如何使用这个类.他没有解释为什么他需要线程安全等等......所以你所谓的"线程安全解决方案"是一些想象的概念,如果你不提供上下文.设计线程安全代码是一件非常困难的事情.有许多方法可以实现线程安全,但我必须承认,对我来说,这些都不容易. (2认同)
  • @IamStalker,"原创海报" (2认同)