在释放锁时,SynchronizationLockException(从未同步的代码块调用对象同步方法。)

时间:2012-12-21 15:23:59

标签: c# multithreading synchronization locking

释放锁时,我收到一个SynchronizationLockException。

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

  1. 在不同于创建的线程上释放互斥锁。
  2. 使用值类型作为Monitor的同步对象。要么 在委托和退出之间修改同步对象 监视。
  3. 问题在于这些模式都不适合我的情况。

    我有一个非常简单的同步方案:

    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
        }
    }
    

    最后,我会在释放锁定的SynchronizationLockException行上收到Dispose()

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

    感谢。

1 个答案:

答案 0 :(得分:0)

我曾经在List实例中获得了SynchronizationLockException,当它调整其底层数组以适应新元素时。已经从三个不同的线程访问了List实例,并且缺少一个锁...

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

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