c# – 使用对象以外的东西锁定线程

当使用锁时,你锁定的东西必须是一个对象.例如,这是合法的

    static DateTime NextCleanup = DateTime.Now;
    const TimeSpan CleanupInterval = new TimeSpan(1, 0, 0);
    private static void DoCleanup()
    {
        lock ((object)NextCleanup)
        {
            if (NextCleanup < DateTime.Now)
            {
                NextCleanup = DateTime.Now.Add(CleanupInterval);
                System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(cleanupThread));
            }
        }
        return;
    }

解决方法:

请注意,即使您尝试在此处执行的操作是可能的(即,如果DateTime是引用类型,因此您可以锁定它),那么它将是合法的,因为您将NextCleanup设置为新的值.锁定块.

您无法在已锁定该对象的代码块中设置对新对象的引用.

这就是为什么建议使用专用的“锁定”对象来为所有需要为相关目的同步的代码.

上一篇:c# – Monitor.TryEnter / Monitor.Exit和SynchronizationLockException


下一篇:c# – 防止对象的并发访问