Можно ли использовать экземпляр 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 117

3 ответа:

Мне кажется, все в порядке. В экземпляре GSON нет ничего, что делает его связанным с конкретным экземпляром LoginSession, поэтому он должен быть статическим.

экземпляры GSON должен быть потокобезопасным, там был ошибка в отношении то, что было исправлено.

базовый Gson класс является потокобезопасным. Я только что столкнулся с проблемой безопасности потоков, которая предположительно была с GSON. Проблема возникла при использовании пользовательского JsonDeserializer и JsonSerializer на Date парсинг и форматирование. Как оказалось, проблема потокобезопасности была связана с использованием моего метода static SimpleDateFormat экземпляра, который не является потокобезопасным. Как только я обернул статический 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.