c# - 我应该在以下情况下使用锁吗

标签 c# .net thread-safety

我设计了一个 Stack 包装器类。我的困惑是,我是否应该在将对象弹出或推送到堆栈变量“ParameterStack”时使用 lock。请让我知道,这个类是否是线程安全的。

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 本身并不完全安全,因为您不拥有代码。假设 Stack 中的某处执行了 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)

}

关于c# - 我应该在以下情况下使用锁吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6007066/

相关文章:

c# - 如何编写触发器?

c# - 如何在 C# Mongodb 强类型驱动程序中基于嵌套数组元素创建索引

.net - 截断 ToolStripStatusLabel 而不是隐藏它

c++ - 左移的负数是否*总是*用 "1"而不是 "0"填充?

c# - 将整数值解析为日期时间

c++ - 在C++中设计线程安全的变量类

c++ - 此多线程用例的最佳数据结构 : Is Intrusive List good?

c# - 如何在 Visual Studio 2017 中禁用 Roslyn 语言服务?

c# - IOException 与 TimeoutException

c# - 线程安全方法?