问题

这是我实施的模型:

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实例用作静态字段是否可以?

感谢你的任何建议/更正。


#1 热门回答(103 赞)

对我来说似乎没问题。 GSON实例中没有任何内容使它与特定的实例LoginSession相关,因此它应该是静态的。

GSON实例should be thread-safe,并且有一个修复的abug regarding


#2 热门回答(14 赞)

coreGsonclass是线程安全的。我刚刚遇到一个与GSON有关的线程安全问题。使用customJsonDeserializerJsonSerializerforDate分析和格式化时发生此问题。事实证明,线程安全问题是我的方法使用的staticSimpleDateFormat实例,它不是线程安全的。一旦我将staticSimpleDateFormat包裹在aThreadLocal实例中,一切都很顺利。


#3 热门回答(9 赞)

根据评论,现有的单元测试并没有真正测试太多,请注意与线程安全相关的任何事情......

有一个unit test检查线程安全:

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

你可能想知道这个单元测试是否足以在每个可能的机器配置上找到每个可能的问题?对此有何评论?

docs中也有这句话:

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


原文链接