根据本文档,System.Object
类型中定义的实例方法似乎不能保证是线程安全的。
这基本上意味着,给定任何类型实例,它是而不是从不同的线程同时调用GetType()
方法是安全的。
对于我知道这种类型也是正确的吗?它实际上是线程安全的(基于文档或已知类型实现)?
例如考虑ImmutableListGetType()
方法时也是如此。
GetType()
方法时也是如此。
在这两种情况下,我可以假设实际上是安全的在不同的线程中同时调用GetType()
方法?
我是怎么问自己这个问题的?
在使用ASP时。我注册了一些无状态服务作为单例依赖,我碰巧在其中一个上调用了GetType()
。Web应用程序本质上是多线程的,所以我问自己在多个线程中同时做这件事的安全性。
为什么这看起来让我困惑?
关键是Object.GetType()
是而不是一个virtual
方法,因此每个类型直接从System.Object
类获得实现。这就是为什么我检查了System.Object
类本身的文档,即使我正在使用一个类线程安全的设计(无状态)。
对于这个
对象的类型信息在对象创建后不能更改,因此直观地没有与之相关的可变状态,所以我选择而不是在同一个对象实例上,从不同的线程同时调用GetType()
可能会有问题。
这种假设纯粹是基于直觉,有时候,事情是反直觉的。除此之外,微软文档明确指出线程安全是而不是保证System.Object
的任何实例方法,所以这个问题的主题对我来说是有意义的。
GetType是一个纯方法,这意味着它不会改变/改变状态,因此本质上是线程安全的。这在具有[Pure]属性的Object.cs的参考源代码中是可见的。