[英]Is it OK to use Gson instance as a static field in a model bean (reuse)?
这是我实现的模型:
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 实例作为静态字段可以吗?
感谢您的任何建议/更正。
核心Gson
类是线程安全的。 我刚刚遇到了一个据称与 GSON 相关的线程安全问题。 使用自定义JsonDeserializer
和JsonSerializer
进行Date
解析和格式化时会出现此问题。 事实证明,线程安全问题在于我的方法使用了非线程安全的静态SimpleDateFormat
实例。 一旦我将静态SimpleDateFormat
包装在一个ThreadLocal
实例中,一切都很好。
根据评论,现有的单元测试并没有真正测试多少,小心与线程安全相关的任何事情......
有一个检查线程安全的单元测试:
/**
* Tests for ensuring Gson thread-safety.
*
* @author Inderjeet Singh
* @author Joel Leitch
*/
public class ConcurrencyTest extends TestCase {
private Gson gson;
...
您可能想知道这个单元测试是否足以在每个可能的机器配置上找到所有可能的问题? 对此有何评论?
文档中也有这句话:
Gson 实例在调用 Json 操作时不维护任何状态。 因此,您可以自由地为多个 Json 序列化和反序列化操作重用同一个对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.