鉴于泛型类型为每种类型的组合创建了单独的静态字段实例,如果我希望所有类型都具有静态字段,这是否是有效的模式?

public class BaseClass
{
    public static int P = 0;
}

public class ChildClass<T> : BaseClass
{
    public static int Q = 0;

    public void Inc()
    {
        // ChildClass<int> will have a different "Q" than ChildClass<double>
        Interlocked.Increment(ref Q);
        // all types of ChildClass will increment the same P
        Interlocked.Increment(ref P);
    }
}


这种方法有什么不安全的地方吗?我的玩具示例可行,但我只是想确保没有可怕的副作用,线程后果等:)

最佳答案

您可以使用Interlocked.Increment获取更多线程安全代码。

public void Inc()
{
    Interlocked.Increment(ref Q); // ChildClass<int> will have a different "Q" than ChildClass<double>
    Interlocked.Increment(ref P); // all types of ChildClass will increment the same P
}


或普通的lock

public class BaseClass
{
    protected static int P = 0;
    protected static object pLock = new object();
}

public class ChildClass<T> : BaseClass
{
    private static int Q = 0;
    private static object qLock = new object();

    public void Inc()
    {
        lock(qLock)
        {
            qLock++;
        }

        lock(pLock)
        {
            qLock++;
        }
    }
}


请注意,对于每个T,都会有一个不同的ChildClass<T>.Q,但是只能有一个BaseClass.P。这意味着您必须使用单独的锁定对象来处理QP(从技术上讲,您用来锁定P的任何内容也可以用于锁定所有Q,但这可能不是您想要的)去做)。

09-28 06:39