Is it OK to use Gson instance as a static field in a model bean (reuse)?
Here's the model I implemented:
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);
}
}
I thought it's useless to create new Gson instance for every LoginSession instance.
But what I'm worried about is thread-safety issues. Approximately 1000+ instances/sec will be created.
Is it OK to use Gson instance as static field?
Thanks for any advices/corrections.
Solution 1:
It seems just fine to me. There is nothing in the GSON instance that makes it related to a specific instance of LoginSession
, so it should be static.
GSON instances should be thread-safe, and there was a bug regarding that which was fixed.
Solution 2:
The core Gson
class is thread-safe. I just encountered a thread-safety issue that was supposedly with GSON. The issue happened when using a custom JsonDeserializer
and JsonSerializer
for Date
parsing and formatting. As it turned out, the thread-safety issue was with my method's use of a static SimpleDateFormat
instance which is not thread-safe. Once I wrapped the static SimpleDateFormat
in a ThreadLocal
instance, everything worked out fine.