내가 구현 한 모델은 다음과 같습니다.
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과 관련하여 스레드 안전성 문제가 발생했습니다. 사용자 정의를 사용하는 경우이 문제는 발생 JsonDeserializer
및 JsonSerializer
위해 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 직렬화 및 역 직렬화 작업에 동일한 객체를 자유롭게 재사용 할 수 있습니다.