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

Posted

技术标签:

【中文标题】SynchronizationLockException(对象同步方法是从未同步的代码块中调用的。)释放锁时【英文标题】:SynchronizationLockException (Object synchronization method was called from an unsynchronized block of code.) when releasing a lock 【发布时间】:2012-12-09 04:28:51 【问题描述】:

释放锁时,我收到了 SynchronizationLockException。

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

    在与创建的线程不同的线程上释放 Mutex。 使用值类型作为监视器的同步对象。要么 在进入和退出之间修改同步对象 监控。

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

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

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,锁被释放。

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

谢谢。

【问题讨论】:

非托管代码导致的堆损坏总是有可能发生的。您的问题中没有任何内容表明这很可能。 对象同步方法是从未同步的代码块中调用的。在 MyClass.Dispose() 在 CleanupForm.OnBtnRemoveClick(Object sender, EventArgs e) 在 System.Windows.Forms.Control.OnClick(EventArgs e) 在 System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent) ... 在系统.Windows.Forms.ButtonBase.WndProc(Message& m) 在 System.Windows.Forms.Button.WndProc(Message& m) 在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 在 System.Windows.Forms.NativeWindow .Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 【参考方案1】:

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

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

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

【讨论】:

以上是关于SynchronizationLockException(对象同步方法是从未同步的代码块中调用的。)释放锁时的主要内容,如果未能解决你的问题,请参考以下文章