鉴于泛型类型为每种类型的组合创建了单独的静态字段实例,如果我希望所有类型都具有静态字段,这是否是有效的模式?
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
。这意味着您必须使用单独的锁定对象来处理Q
和P
(从技术上讲,您用来锁定P
的任何内容也可以用于锁定所有Q
,但这可能不是您想要的)去做)。