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.
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 customJsonDeserializer
andJsonSerializer
forDate
parsing and formatting. As it turned out, the thread-safety issue was with my method's use of a staticSimpleDateFormat
instance which is not thread-safe. Once I wrapped the staticSimpleDateFormat
in aThreadLocal
instance, everything worked out fine.According to the comments the existing unit test does not really test much, be careful with anything related to thread safety...
There is a unit test checking for thread safety:
You may wonder if this unit test is sufficient to find every possible problem on every possible machine configuration ? Any comments on this ?
There is also this sentence in the docs:
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.