我正在开发一个高度多线程的Java应用程序,其中在大量线程之间共享一个全局Gson实例。目前我还没有注意到任何性能下降,但到目前为止,Json的处理量相对较低。
我想知道创建每个线程获取并从中释放Gson实例的Gson实例的资源池是否有意义?具体而言,是否会避免线程被阻塞等待访问全局Gson实例的情况?
Gson文档提到:" Gson实例是线程安全的,因此您可以在多个线程中自由地重用它们。"。但是,我无法弄清楚这是否意味着它只是在完成之前锁定或者它是否使用了一些内部资源池。
答案 0 :(得分:2)
我想知道创建每个线程获取并从中释放Gson实例的Gson实例的资源池是否有意义?
不,它不会。
Gson线程安全性由其不变性和创建者/工厂式设计完成。
您创建的Gson
实例无法更改,Gson
类不提供任何方式:
final
来表达这个意图)。由于在Gson
实例中没有要修改的内容,因此它不需要只读语义的同步机制:
synchronized
需要付费)。因此,调用任何Gson
方法都是线程安全的,但从这些方法返回的对象可能缺乏线程安全性(例如,JsonReader
/ JsonWriter
不是线程安全的; JsonElement
及其子类可能是线程不安全的;等等。
考虑到这一点,您必须确保您的类型适配器(Gson序列化器/反序列化器)通过其设计是线程安全的,并且不会改变它们的内部状态--Gson严重依赖于此(据我所知,所有Gson构建 - 在类型适配器中是不可变的)。
显然,如果特定类型的适配器使用同步机制(并且它显然是一个瓶颈),Gson
from
和to
方法可能等待它们使用这种类型的适配器,但是您仍然可以使用来自其他线程的Gson
实例(但是我永远不会设计,实现和使用在引擎盖下使用同步的类型适配器。)
所以,
单个全局Gson实例在大量线程之间共享
完全没问题。