Можно ли использовать экземпляр Gson как статическое поле в модели bean (повторное использование)?

Здесь реализована модель I:

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 как статическое поле?

Спасибо за любые советы/исправления.

Ответ 1

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

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

Ответ 2

Ядро Gson класс потокобезопасен. Я только что столкнулся с проблемой безопасности потоков, которая предположительно была с GSON. Проблема возникла при использовании пользовательских JsonDeserializer и JsonSerializer для Date синтаксического анализа и форматирования. Как выяснилось, проблема защиты потоков была связана с использованием моим методом статического экземпляра SimpleDateFormat, который не является потокобезопасным. Как только я завернул статический SimpleDateFormat в экземпляре ThreadLocal, все получилось отлично.

Ответ 3

В соответствии с комментариями существующий unit test не очень много тестирует, будьте осторожны со всем, что связано с безопасностью потоков...

Существует проверка unit test безопасности потоков:

/**
 * Tests for ensuring Gson thread-safety.
 *
 * @author Inderjeet Singh
 * @author Joel Leitch
 */
public class ConcurrencyTest extends TestCase {
  private Gson gson;
  ...

Вы можете задаться вопросом, достаточно ли этого unit test, чтобы найти все возможные проблемы при каждой возможной конфигурации машины? Любые комментарии по этому поводу?

Это предложение также содержится в docs:

Экземпляр Gson не поддерживает какое-либо состояние при вызове Json операции. Таким образом, вы можете повторно использовать один и тот же объект для нескольких Операции сериализации и десериализации Json.