Oto model, który zaimplementowałem:
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);
}
}
Uważam, że tworzenie nowej instancji Gson dla każdej instancji LoginSession jest bezcelowe.
Ale martwię się o kwestie bezpieczeństwa nici. Zostanie utworzonych około 1000+ instancji / s.
Czy można używać instancji Gson jako pola statycznego?
Dzięki za wszelkie porady / poprawki.
java
static
thread-safety
gson
philipjkim
źródło
źródło
Gson
Klasa podstawowa jest bezpieczna wątkowo. Właśnie napotkałem problem z bezpieczeństwem wątków, który podobno był związany z GSON. Wystąpił problem podczas korzystania z pliku niestandardowegoJsonDeserializer
orazJsonSerializer
doDate
analizowania i formatowania. Jak się okazało, problem z bezpieczeństwem wątków był związany z używaniem przez moją metodęSimpleDateFormat
instancji statycznej, która nie jest bezpieczna dla wątków. Po umieszczeniu statycznejSimpleDateFormat
wThreadLocal
instancji wszystko poszło dobrze.źródło
Zgodnie z komentarzami, istniejący test jednostkowy tak naprawdę nie testuje zbyt wiele, bądź ostrożny z czymkolwiek związanym z bezpieczeństwem wątków ...
Istnieje test jednostkowy sprawdzający bezpieczeństwo wątków:
Możesz się zastanawiać, czy ten test jednostkowy wystarczy, aby znaleźć każdy możliwy problem na każdej możliwej konfiguracji maszyny? Jakieś uwagi na ten temat?
Jest też to zdanie w docs :
źródło
Jakiś czas temu mieliśmy problemy z bezpieczeństwem wątków i rozwiązaliśmy je za pomocą FastDateFormat w apache commons.
Właśnie stworzyłem link do Gist wokół tego, aby pomóc ludziom zastanawiać się, czy instancje Gson można ponownie wykorzystać. Nie mają seterów i wszystkie zmienne są prywatne.
Więc poza problemem SimpleDateFormat nie widzę, aby utrzymywały stan nigdzie indziej.
Sprawdź to . Odpowiadam na jedno z nich po raz pierwszy. Chętnie oddam choć raz. :)
źródło