[java] 모델 빈에서 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);
    }
}

모든 LoginSession 인스턴스마다 새 Gson 인스턴스를 만드는 것이 쓸모 없다고 생각했습니다.

그러나 내가 걱정하는 것은 스레드 안전성 문제입니다. 약 1000 개 이상의 인스턴스 / 초가 생성됩니다.

정적 필드로 Gson 인스턴스를 사용해도 괜찮습니까?

조언 / 수정에 감사드립니다.



답변

나에게 괜찮아 보인다. GSON 인스턴스에는의 특정 인스턴스와 관련된 것은 LoginSession없으므로 정적이어야합니다.

GSON 인스턴스는 스레드 안전해야 하고, 거기 에 대한 버그 수정 된 것으로는.


답변

핵심 Gson클래스는 스레드로부터 안전합니다. 방금 GSON과 관련하여 스레드 안전성 문제가 발생했습니다. 사용자 정의를 사용하는 경우이 문제는 발생 JsonDeserializerJsonSerializer위해 Date분석 및 서식. 결과적으로 스레드 안전 문제는 SimpleDateFormat스레드 안전하지 않은 정적 인스턴스를 사용하는 메소드와 관련이 있습니다. 인스턴스 에서 정적 SimpleDateFormat을 래핑하면 ThreadLocal모든 것이 잘 작동했습니다.


답변

의견에 따르면 기존 단위 테스트는 실제로 많은 테스트를 수행하지 않으므로 스레드 안전과 관련된 모든 것에주의하십시오 …

스레드 안전성을 검사 하는 단위 테스트 가 있습니다 .

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

이 장치 테스트가 가능한 모든 기계 구성에서 가능한 모든 문제를 찾기에 충분한 지 궁금 할 것입니다. 이것에 대한 의견?

문서 에이 문장이 있습니다 .

Gson 인스턴스는 Json 작업을 호출하는 동안 상태를 유지하지 않습니다. 따라서 여러 Json 직렬화 및 역 직렬화 작업에 동일한 객체를 자유롭게 재사용 할 수 있습니다.


답변

우리는 잠시 스레드 안전성에 문제가 있었고 Apache 공통점에서 FastDateFormat을 사용하여 문제를 해결했습니다.

Gson 인스턴스를 재사용 할 수 있는지 궁금해하는 사람들을 돕기 위해 요점에 대한 요점 링크를 만들었습니다 . 그들은 세터가 없으며 모든 vars는 비공개입니다.

따라서 SimpleDateFormat 문제 이외의 다른 곳에서는 상태를 유지하는 것으로 보이지 않습니다.

확인 하십시오 . 이것들 중 하나에 답장하는 것은 처음입니다. 한 번 돌려주는 것이 행복합니다. 🙂


답변