可以使用Gson实例作为模型bean中的静态字段(重用)吗?
这是我实现的模型:
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实例创build新的Gson实例是没有用的。
但是我担心的是线程安全问题。 将会创build大约1000+个实例/秒。
可以使用Gson实例作为静态字段吗?
感谢您的任何build议/更正。
对我来说这似乎很好。 GSON实例中没有任何内容使其与LoginSession
的特定实例相关,所以它应该是静态的。
GSON实例应该是线程安全的 ,并且存在一个关于修复的bug 。
核心Gson
类是线程安全的。 我刚刚遇到了一个与GSON有关的线程安全问题。 使用自定义的JsonDeserializer
和JsonSerializer
进行Date
分析和格式化时发生问题。 事实certificate,线程安全问题是我的方法使用了一个不是线程安全的静态SimpleDateFormat
实例。 一旦我将静态的SimpleDateFormat
包装在一个ThreadLocal
实例中,一切都很好。
根据评论,现有的unit testing并没有太多的testing,要小心与线程安全相关的任何事情。
有一个unit testing检查线程安全性:
/** * Tests for ensuring Gson thread-safety. * * @author Inderjeet Singh * @author Joel Leitch */ public class ConcurrencyTest extends TestCase { private Gson gson; ...
你可能想知道这个unit testing是否足以在每个可能的机器configuration上find每个可能的问题? 对此有何评论?
文档中还有这样一句话:
Gson实例在调用Json操作时不保持任何状态。 所以,你可以自由地重复使用同一个对象来进行多个Json序列化和反序列化操作。