Вот модель, которую я реализовал:
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 в качестве статического поля?
Спасибо за любые советы / исправления.
java
static
thread-safety
gson
филиппьким
источник
источник
Базовый
Gson
класс является потокобезопасным. Я только что столкнулся с проблемой безопасности потоков, которая предположительно была связана с GSON. Проблема возникла при использовании кастомаJsonDeserializer
иJsonSerializer
дляDate
синтаксического анализа и форматирования. Как оказалось, проблема с поточной безопасностью заключалась в том, что мой метод использовал статическийSimpleDateFormat
экземпляр, который не является поточно-ориентированным. Как только я обернул статикуSimpleDateFormat
вThreadLocal
экземпляр, все сработало нормально.источник
Согласно комментариям, существующий модульный тест на самом деле не тестирует много, будьте осторожны со всем, что связано с безопасностью потоков ...
Существует модульный тест, проверяющий безопасность потоков:
/** * Tests for ensuring Gson thread-safety. * * @author Inderjeet Singh * @author Joel Leitch */ public class ConcurrencyTest extends TestCase { private Gson gson; ...
Вы можете задаться вопросом, достаточно ли этого модульного теста, чтобы найти все возможные проблемы на каждой возможной конфигурации машины? Есть комментарии по этому поводу?
Существует также это предложение в документации :
источник
Некоторое время назад у нас были проблемы с безопасностью потоков, и мы решили их, используя FastDateFormat в общих ресурсах apache.
Просто создал ссылку на Gist вокруг этого, чтобы помочь людям, которые задаются вопросом, можно ли повторно использовать экземпляры Gson. У них нет сеттеров, и все вары частные.
Поэтому, кроме проблемы SimpleDateFormat, я не вижу, чтобы они поддерживали состояние где-либо еще.
Проверьте это . Я впервые отвечаю на один из них. Рад вернуть хоть раз. :)
источник