내 자신의 클래스에서 Jackson JSON 프로세서를 래핑하는 중이고 공유 인스턴스를 처리하기위한 확실한 스레드 안전성 및 성능이 뛰어난 방법을 찾지 못했습니다.잭슨 JSON 독자를위한 최고의 처리?
는 문서에 따르면, ObjectMapper
, ObjectWriter
및 ObjectReader
모든 스레드 안전 내가 우선적으로 ObjectWriter
및 ObjectReader
를 사용해야합니다. ObjectWriter
처리
꽤 솔직하지만, 심지어 Jackson Data-bind docs에 ObjectReader
에 대한 명확한 지침이 없다 그리고 내가 ObjectReaders
모든 내 자신을 생성하고 캐시해야 함을 암시한다. 이것이 내가 한 일입니다.
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectReader;
import com.fasterxml.jackson.databind.ObjectWriter;
import java.util.HashMap;
import java.util.Map;
public class JacksonEngine extends JsonProcessor {
private ObjectMapper mapper = new ObjectMapper();
private ObjectWriter writer = mapper.writer();
private Map<Class, ObjectReader> readers = new HashMap<>();
public String serialize(Object object) throws Exception {
return writer.writeValueAsString(object);
}
public <T> T deserialize(String json, Class<T> classOfT)
throws Exception {
if (!readers.containsKey(classOfT)) {
readers.put(classOfT, mapper.readerFor(classOfT));
}
return readers.get(classOfT).readValue(json);
}
}
이것은 작동할까요?
해시 맵 키에 대해 Class
이 아닌 제네릭으로 변환해야한다고 가정하면 Class<T>
이 괜찮을 것이라고 가정합니다.
if not present then add
if not present then add
멀티 쓰레드 조건에서 캐시에 새로운 Readers
을 넣는 작업은 중복 된 리더 또는 2의 잠재적 생성을 제외하고는 문제가되지 않는다고 가정합니다.
마지막으로 성능 향상을 위해 Readers
의 캐싱을 수행 할 가치가 있다고 가정합니다. 온라인에서 사람들이 사용하는 예제를 찾지 못했지만 말입니다.
'최종'및 v.흥미로운 점은 해시 맵이 메모리에 어디에 위치하는지에 관한 것입니다. - JacksonEngine이 싱글 톤이 될 것이고, 해시 맵 내용의 가시성이 개별 CPU 캐시에만 국한되지는 않을 것이라고 생각했기 때문에 - 멤버 변수입니다. – Adam
싱글 톤이라는 사실은 맵 데이터가 캐시 된 위치와 아무 관련이 없습니다. 나는 심지어 당신이 캐시 미스가 있기를 원한다고 말하면서 CPU가 업데이트 된 값을 검색 할 것이라고 말할 것이다. 동기화하지 않으면 CPU에 업데이트 된 내용이 표시되거나 처음부터 업데이트가 표시되지 않을 수 있습니다. – xTrollxDudex
그러나 'ObjectReaders'는 캐시되어야하며 스레드 로컬도 아닙니다. 어떻게 그걸 성취합니까? 'ConcurrentHashMap' 작업을하거나 동기화해야합니까? – Adam