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(对象同步方法是从未同步的代码块中调用的。)释放锁时的主要内容,如果未能解决你的问题,请参考以下文章