我设计了一个Stack wrapper类。我的困惑是,在将对象弹出或推入堆栈变量“ lock
”时是否应该使用ParameterStack
。请让我知道,该类是否是线程安全的。
public static class StackManager
{
private static Stack ParameterStack = new Stack();
public static T Pop<T>()
{
T RawObject;
T Result = default(T);
lock (ParameterStack)
{
RawObject = (T)ParameterStack.Pop();
}
if (RawObject != null && RawObject is T)
Result = (T)RawObject;
return (T)Result;
}
public static void Push<T>(T Data)
{
lock (ParameterStack)
{
ParameterStack.Push(Data);
}
}
}
我创建了这个StackManager类是为了学习。
最佳答案
看起来还可以。有一个(相当理论上的)论据认为,锁定ParameterStack
本身并不完全安全,因为您不拥有代码。假设堆栈内部某处执行lock(this)
,则可能会死锁。
public static class StackManager
{
private static Stack parameterStack = new Stack();
private static object stackLock = new object();
// now use lock(stackLock) instead of lock(ParameterStack)
}