Gson性能是否可以从高度多线程应用程序中的资源池中受益?

时间:2018-03-09 12:27:48

标签: java multithreading gson pool

我正在开发一个高度多线程的Java应用程序,其中在大量线程之间共享一个全局Gson实例。目前我还没有注意到任何性能下降,但到目前为止,Json的处理量相对较低。

我想知道创建每个线程获取并从中释放Gson实例的Gson实例的资源池是否有意义?具体而言,是否会避免线程被阻塞等待访问全局Gson实例的情况?

Gson文档提到:" Gson实例是线程安全的,因此您可以在多个线程中自由地重用它们。"。但是,我无法弄清楚这是否意味着它只是在完成之前锁定或者它是否使用了一些内部资源池。

1 个答案:

答案 0 :(得分:2)

  

我想知道创建每个线程获取并从中释放Gson实例的Gson实例的资源池是否有意义?

不,它不会。 Gson线程安全性由其不变性和创建者/工厂式设计完成。 您创建的Gson实例无法更改,Gson类不提供任何方式:

  • 它是不可变的,它的状态不能从外部改变(它不提供可以改变其状态的方法+它的字段被声明为final来表达这个意图)。
  • 它也不允许以传递方式更改其状态(例如,它不允许您通过" get"方法获取私有字段并从外部更改对象。)

由于在Gson实例中没有要修改的内容,因此它不需要只读语义的同步机制:

  • 您不需要为通常使用的内容付费(synchronized需要付费)。
  • 它使设计和实施变得简单。

因此,调用任何Gson方法都是线程安全的,但从这些方法返回的对象可能缺乏线程安全性(例如,JsonReader / JsonWriter不是线程安全的; JsonElement及其子类可能是线程不安全的;等等。 考虑到这一点,您必须确保您的类型适配器(Gson序列化器/反序列化器)通过其设计是线程安全的,并且不会改变它们的内部状态--Gson严重依赖于此(据我所知,所有Gson构建 - 在类型适配器中是不可变的)。 显然,如果特定类型的适配器使用同步机制(并且它显然是一个瓶颈),Gson fromto方法可能等待它们使用这种类型的适配器,但是您仍然可以使用来自其他线程的Gson实例(但是我永远不会设计,实现和使用在引擎盖下使用同步的类型适配器。)

所以,

  

单个全局Gson实例在大量线程之间共享

完全没问题。