c# - 释放锁时出现 SynchronizationLockException(从未同步的代码块调用了对象同步方法。)

标签 c# multithreading synchronization locking

释放锁时我收到 SynchronizationLockException。

当然,我做的第一件事就是用谷歌搜索这个问题。我发现了两个主要的错误模式:

  1. 在与创建互斥锁不同的线程上释放互斥锁。
  2. 使用值类型作为 Monitor 的同步对象。或者 修改进入和退出之间的同步对象 监控。

问题是这些模式都不适合我的情况。

我有一个非常简单的同步场景:

public class MyClass : IDisposable
{
    private readonly object _myLock = new object();

    internal void Func1()
    {
        lock (_myLock)
        {
            //Some code here
        }
    }

    internal void Func2()
    {
        lock (_myLock)
        {
            //Some code here
        }
    }

    public void Dispose()
    {
        lock (_myLock)
        {
            //Some code here
        }  // Here is where I get an exception
    }
}

最终,我在释放锁的 Dispose() 行收到 SynchronizationLockException

我的问题不是“我的代码有什么问题”或“我做错了什么”。基本上,我想知道 lock 的 .NET 实现如何(以及在​​何种情况下)可能会抛出此异常。

谢谢。

最佳答案

我曾经在 List 实例中遇到 SynchronizationLockException,当时它正在调整其基础数组的大小时以适应新元素。 List 实例已从三个不同的线程访问,并且缺少一个锁...

我会说:三重检查您是否以正确的方式进行线程同步。

此外,以正确的方式实现 IDisposable 模式(参见 http://msdn.microsoft.com/en-us/library/fs2xkftw.aspx )。也许终结器让你头疼。

关于c# - 释放锁时出现 SynchronizationLockException(从未同步的代码块调用了对象同步方法。),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13992730/

相关文章:

c# - 将整数转换为货币

java - 从计时器线程调用 java 计时器任务

java - 线程没有被终止;陷入循环

java - 在与外部同步相同的对象上进行内部同步

synchronization - Unison:仅在一个方向同步

c# - C# 程序员如何使用 javascript 编写解决方案?

c# - 数字签名 : Encrypting the Hash vs Signing the Hash?

c# 重写 RichTextBox 粘贴函数 - Win Form App

使用计数器的 Java 数据竞争示例

java - 对我的客户端 Java 程序进行多线程处理