Aqui está o modelo que eu implementei:
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);
}
}
Eu pensei que era inútil criar uma nova instância do Gson para cada instância do LoginSession.
Mas o que me preocupa são os problemas de segurança de threads. Aproximadamente 1000 instâncias / s serão criadas.
Posso usar a instância do Gson como campo estático?
Obrigado por quaisquer conselhos / correções.
java
static
thread-safety
gson
philipjkim
fonte
fonte
A
Gson
classe principal é segura para threads. Acabei de encontrar um problema de segurança de segmento que supostamente estava com o GSON. O problema ocorreu ao usar um costumeJsonDeserializer
eJsonSerializer
paraDate
analisar e formatar. Como se viu, o problema de segurança do thread estava no uso do meu método de umaSimpleDateFormat
instância estática que não é segura para threads. Depois que envolvi a estáticaSimpleDateFormat
em umThreadLocal
exemplo, tudo deu certo.fonte
De acordo com os comentários, o teste de unidade existente realmente não testa muito, tenha cuidado com qualquer coisa relacionada à segurança da linha ...
Há um teste de unidade que verifica a segurança da linha:
Você pode se perguntar se esse teste de unidade é suficiente para encontrar todos os problemas possíveis em todas as configurações possíveis da máquina? Algum comentário sobre isso?
Há também esta frase nos documentos :
fonte
Há algum tempo, tivemos problemas com a segurança do encadeamento e resolvemos usando o FastDateFormat no apache commons.
Apenas criei um link gist para Gist em torno disso para ajudar as pessoas que se perguntam se as instâncias do Gson podem ser reutilizadas. Eles não têm setters e todos os vars são particulares.
Portanto, além do problema SimpleDateFormat, não os vejo mantendo o estado em nenhum outro lugar.
Verifique isso . É a primeira vez que respondo a uma delas. Feliz em retribuir pela primeira vez. :)
fonte