5

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

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

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

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

4

3 回答 3

5

概括一下这个问题:离散实例JavaScriptSerializer可以在不同线程上使用,并且最多有一个线程与特定实例交互吗?

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

我不能给你那个。但是,(您可能知道)文档中的线程安全消息非常通用,并且几乎无处不在(例外是管理并发的类型)。

轶事:我不知道存储共享内部状态的任何类型不是线程安全的。这无异于问你是否可以在两个不同的线程上使用 a Listor的两个不同实例;XmlDocument如果您不能,该框架将毫无用处。

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

反编译源的快速查看显示没有共享的内部状态。正如@usr 所指出的,不能保证内部实现的一致性。但是,由于上述原因,这种情况似乎不太可能发生变化。

尽管如此,JSON.net 库通常被认为是 JSON(反)序列化的卓越替代品,因为它的性能和灵活性。

于 2013-10-18T17:12:04.557 回答
1

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

您无法测试线程安全性。线程错误可能只会在负载下或在生产中出现。

此外,实施可以随时更改。安装 Windows 更新、Service Pack 或新版本,您的代码就会中断。

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

于 2013-10-18T16:41:10.953 回答
1

如果类型包含静态私有不安全

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

于 2013-10-18T17:45:18.687 回答