Object.GetType()方法线程安全



根据本文档,System.Object类型中定义的实例方法似乎不能保证是线程安全的。

这基本上意味着,给定任何类型实例,它是而不是从不同的线程同时调用GetType()方法是安全的。

对于我知道这种类型也是正确的吗?它实际上是线程安全的(基于文档或已知类型实现)?

例如考虑ImmutableList类。这种类型的文档是线程安全的,所以我希望我可以安全地从多个线程并发地使用这种类型的任何实例,即使在调用GetType()方法时也是如此。

另一个例子是在ASP中使用的无状态服务类。. NET核心应用程序:无钢类在设计上是线程安全的(因为在并发处理类实例时没有状态会混乱)。在这里,我希望是而不是在多个线程中并发地使用同一个实例,甚至在调用GetType()方法时也是如此。

在这两种情况下,我可以假设实际上是安全的在不同的线程中同时调用GetType()方法?

我是怎么问自己这个问题的?

在使用ASP时。我注册了一些无状态服务作为单例依赖,我碰巧在其中一个上调用了GetType()。Web应用程序本质上是多线程的,所以我问自己在多个线程中同时做这件事的安全性。

为什么这看起来让我困惑?

关键是Object.GetType()而不是一个virtual方法,因此每个类型直接从System.Object类获得实现。这就是为什么我检查了System.Object类本身的文档,即使我正在使用一个类线程安全的设计(无状态)。

对于这个

对象的类型信息在对象创建后不能更改,因此直观地没有与之相关的可变状态,所以我选择而不是在同一个对象实例上,从不同的线程同时调用GetType()可能会有问题。

这种假设纯粹是基于直觉,有时候,事情是反直觉的。除此之外,微软文档明确指出线程安全是而不是保证System.Object的任何实例方法,所以这个问题的主题对我来说是有意义的。

GetType是一个纯方法,这意味着它不会改变/改变状态,因此本质上是线程安全的。这在具有[Pure]属性的Object.cs的参考源代码中是可见的。

最新更新