在模型 bean 中使用 Gson 实例作为静态字段(重用)可以吗?

下面是我实现的模型:

public class LoginSession {
private static final Gson gson = new Gson();


private String id;
private String name;
private long timestamp;


public LoginSession(String id, String name) {
this.id = id;
this.name = name;
this.timestamp = System.currentTimeMillis();
}


public String toJson() {
return gson.toJson(this);
}


public static LoginSession fromJson(String json) {
checkArgument(!isNullOrEmpty(json));
return gson.fromJson(json, LoginSession.class);
}
}

我认为为每个 LoginSession 实例创建新的 Gson 实例是无用的。

但是我担心的是线程安全问题,大约每秒会创建1000多个实例。

使用 Gson 实例作为静态字段可以吗?

谢谢你的建议/纠正。

65947 次浏览

我觉得挺好的。GSON 实例中没有任何东西使它与特定的 LoginSession实例相关,因此它应该是静态的。

GSON 实例 应该是线程安全的,有一个 关于,这是固定的。

根据注释,现有的单元测试实际上并没有进行太多的测试,要小心任何与线程安全相关的东西..。

有一个 单元测试线程安全检查:

/**
* Tests for ensuring Gson thread-safety.
*
* @author Inderjeet Singh
* @author Joel Leitch
*/
public class ConcurrencyTest extends TestCase {
private Gson gson;
...

您可能想知道这个单元测试是否足以发现每个可能的机器配置上的每个可能的问题?有什么意见吗?

医生中也有这样一句话:

Gson 实例在调用 Json 时不维护任何状态 因此,您可以自由地将同一对象重用于多个 Json 序列化和反序列化操作。

核心 Gson类是线程安全的。我刚刚遇到了一个线程安全问题,应该是与 GSON。在使用定制的 JsonDeserializerJsonSerializer进行 Date解析和格式化时发生了这个问题。事实证明,线程安全问题是我的方法使用了一个不是线程安全的静态 SimpleDateFormat实例。一旦我将静态 SimpleDateFormat包装到 ThreadLocal实例中,一切都会顺利进行。

前段时间我们遇到了线程安全问题,我们通过在 apache commons 中使用 FastDateFormat 解决了这个问题。

刚刚围绕此创建了一个要点 链接到 Gist,以帮助人们了解 Gson 实例是否可以重用。它们没有 setter,所有 var 都是私有的。

因此,除了 SimpleDateFormat 问题,我没有看到它们在其他任何地方维护状态。

检查 。这是我第一次回复。很高兴能回馈社会一次。:)