.net JavascriptSerializer或JavascriptDeserializer的不同实例上的不同线程是否线程安全

.net JavascriptSerializer或JavascriptDeserializer的不同实例上的不同线程是否线程安全,.net,json,multithreading,serialization,thread-safety,.net,Json,Multithreading,Serialization,Thread Safety,我在这里寻找一个明确的答案 根据JavascriptSerializer的公共静态方法是线程安全的,但非静态方法不是 是否保证对于此类的公共非静态方法,运行不同线程的不同实例是线程安全的(即,没有可能违反线程安全的私有静态资源)?我特别感兴趣的是JavascriptSerializer和JavascriptDeserializer中的序列化和反序列化方法,但我想大致了解答案 也就是说,如果线程A只在实例A上运行,线程B只在实例B上运行,那么在这种情况下,是否有公共非静态方法的线程安全性的明确保证

我在这里寻找一个明确的答案

根据JavascriptSerializer的公共静态方法是线程安全的,但非静态方法不是

是否保证对于此类的公共非静态方法,运行不同线程的不同实例是线程安全的(即,没有可能违反线程安全的私有静态资源)?我特别感兴趣的是JavascriptSerializer和JavascriptDeserializer中的序列化和反序列化方法,但我想大致了解答案


也就是说,如果线程A只在实例A上运行,线程B只在实例B上运行,那么在这种情况下,是否有公共非静态方法的线程安全性的明确保证?

您没有线程安全性保证,因为只有文档可以保证这一点。但事实并非如此

不能测试线程安全性。线程错误可能只在加载或生产中出现

而且,实现可以随时更改。安装Windows Update、Service Pack或新版本后,代码将中断


就我而言,这是一个明确的答案——你不能依赖它。此外,我不明白为什么即使对于少量数据,定期创建一个新实例也会是一个问题。反序列化比实例化单个对象更需要CPU。创建一个(小)对象非常便宜。

重述一下这个问题:
JavaScriptSerializer
的离散实例是否可以在不同的线程上使用,最多有一个线程与特定实例交互

我在这里寻找一个明确的答案

我不能给你这个。然而,(正如您可能知道的)文档中的线程安全消息是非常通用的,几乎无处不在(管理并发性的类型除外)

轶事:我不知道有哪种类型存储的共享内部状态不是线程安全的。这相当于询问您是否可以在两个不同的线程上使用
列表
XmlDocument
的两个不同实例;如果您不能,那么这个框架将毫无用处

JavaScriptSerializer
意味着要像web服务器一样在多个线程上多次实例化(ASP.Net线程非常复杂,但类型的多个实例肯定会在不同的线程上创建和调用)。MVC框架在内部使用了
JavaScriptSerializer
,因此很明显,团队打算在多线程web环境中使用它

反编译源的快速视图显示没有共享的内部状态。正如@usr所指出的,无法保证内部实现的一致性。然而,由于上述原因,这种情况似乎极不可能改变


综上所述,由于其性能和灵活性,JSON(反)序列化通常被认为是一种更好的替代方法。

如果类型包含静态私有数据


说它就像滴答作响的炸弹。我想没有人会这么做。

System.Web.Helpers.Json使用它就像使用线程安全一样: