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