Null readonly lock object

17 浏览
0 Comments

Null readonly lock object

一个静态只读对象如何变成null?(我将_lock对象设置为静态和非静态,但始终是只读的。)validate方法在前几次正常工作,然后在调用2-3次之后,_lock对象变为null。这是否表明锁被另一个线程占有?

0
0 Comments

在这段代码中,问题出现的原因是在类的静态构造函数中将_lock字段设置为null。静态构造函数在类的第一个实例被创建或者静态成员被访问之前被调用。因此,当Validate方法调用时,_lock字段已经被设置为null,导致在lock语句中发生NullReferenceException异常。

解决这个问题的方法是确保在静态构造函数中不要将_lock字段设置为null。如果必须要设置为null,可以考虑使用其他方式来进行线程同步操作,而不是使用lock语句。

以下是修改后的代码示例:

class Program
{
    class A
    {
        private static readonly object _lock = new object();
        public void Validate()
        {
            lock (_lock) // 正常运行
            {
                Console.WriteLine("Not going to make it here...");
            }
        }
        static A()
        {
            Console.WriteLine(_lock.ToString());
            Console.WriteLine("Now you can see that _lock is set...");
            // _lock = null;  // 移除将_lock设置为null的代码
        }
    }
    static void Main(string[] args)
    {
        var a = new A();
        a.Validate();
    }
}

通过这种修改,可以确保在Validate方法中使用_lock字段进行线程同步时不会出现NullReferenceException异常。

0