Можно ли использовать экземпляр Gson как статическое поле в модели bean (повторное использование)?
Здесь реализована модель I:
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);
}
}
Я думал, что бесполезно создавать новый экземпляр Gson для каждого экземпляра LoginSession.
Но я беспокоюсь о проблемах с потоками. Будет создано около 1000 экземпляров/сек.
Можно ли использовать экземпляр Gson как статическое поле?
Спасибо за любые советы/исправления.
Ответы
Ответ 1
Мне кажется, что это прекрасно. В экземпляре GSON ничего нет, поэтому он связан с конкретным экземпляром LoginSession
, поэтому он должен быть статическим.
Экземпляры GSON должны быть потокобезопасными, а также была ошибка относительно, которая была исправлена.
Ответ 2
Ядро Gson
класс потокобезопасен. Я только что столкнулся с проблемой безопасности потоков, которая предположительно была с GSON. Проблема возникла при использовании пользовательских JsonDeserializer
и JsonSerializer
для Date
синтаксического анализа и форматирования. Как выяснилось, проблема защиты потоков была связана с использованием моим методом статического экземпляра SimpleDateFormat
, который не является потокобезопасным. Как только я завернул статический SimpleDateFormat
в экземпляре ThreadLocal
, все получилось отлично.
Ответ 3
В соответствии с комментариями существующий unit test не очень много тестирует, будьте осторожны со всем, что связано с безопасностью потоков...
Существует проверка unit test безопасности потоков:
/**
* Tests for ensuring Gson thread-safety.
*
* @author Inderjeet Singh
* @author Joel Leitch
*/
public class ConcurrencyTest extends TestCase {
private Gson gson;
...
Вы можете задаться вопросом, достаточно ли этого unit test, чтобы найти все возможные проблемы при каждой возможной конфигурации машины? Любые комментарии по этому поводу?
Это предложение также содержится в docs:
Экземпляр Gson не поддерживает какое-либо состояние при вызове Json операции. Таким образом, вы можете повторно использовать один и тот же объект для нескольких Операции сериализации и десериализации Json.