我设计了一个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)

}

10-06 03:31