클래스 중 하나에서 우리는 수천 개의 압축 형식 압축, 동시 스레드에서 압축 풀기를 수행하고 있습니다.java.util.zip.Deflater 및 java.util.zip.Inflater 클래스 스레드 안전성
모든 압축/압축 풀기는 각각 Deflater & Inflater의 새 인스턴스를 만들어 수행합니다.
이러한 클래스가 스레드로부터 안전 할 경우 설명서를 찾을 수 없습니다. 모든 포인터가 도움이 될 것입니다.
클래스 중 하나에서 우리는 수천 개의 압축 형식 압축, 동시 스레드에서 압축 풀기를 수행하고 있습니다.java.util.zip.Deflater 및 java.util.zip.Inflater 클래스 스레드 안전성
모든 압축/압축 풀기는 각각 Deflater & Inflater의 새 인스턴스를 만들어 수행합니다.
이러한 클래스가 스레드로부터 안전 할 경우 설명서를 찾을 수 없습니다. 모든 포인터가 도움이 될 것입니다.
이러한 클래스는 스레드 안전 이유입니다,하지만 난 당신이 천천히 그것에 대해 생각하고 스스로 답 찾으려면 :
java.util.zip.Deflater
:
디플레이터 클래스 은 RFC 1951에 설명 된 수축 알고리즘을 사용하여 입력을 압축합니다. 아래에 설명 된 여러 압축 수준과 세 가지 전략이 있습니다.
이 클래스는 이 아니라 스레드 안전입니다. 이는 deflate와 setInput의 분할로 인해 API에 내재되어 있습니다 ().
소스 코드 : http://developer.classpath.org/doc/java/util/zip/Deflater-source.html
결론 : 압축 보낸이 완화 문자 코드 값과 바이트 원시 변형이다. 다른 (또는 모호한) 프로세스에서 동시에 압축되는 바이트 체인을 편집하는 것은 좋지 않습니다. 출력이 손상 될 수 있습니다!.
java.util.zip.Inflater
:
의 Inflater 는 압축을 RFC 사용량은 다음과 같은 것이다 1950에 기재된 "수축"표준에 따라 압축 된 데이터를 사용된다. 먼저
setInput()
으로 입력을 설정 한 다음 inflate()합니다. inflate가 바이트를 부 풀리지 않으면 다음과 같은 세 가지 이유가있을 수 있습니다.일단 첫 번째 출력 바이트가 생성되면 이후 단계에서는 사전이 필요하지 않습니다.
- needsInput()은 입력 버퍼가 비어있어 true을 반환합니다.
setInput()
과 함께 더 많은 입력을 제공해야합니다.
참고 : 스트림이 완료되면 needsInput()도 true를 반환합니다.- needsDictionary()가 true를 반환하면 사전 설정 사전에
setDictionary()
을 제공해야합니다.- finished()가 true를 반환하면 인플레이레이터가 끝났습니다.
소스 코드 : http://developer.classpath.org/doc/java/util/zip/Inflater-source.html는
결론은 : 데이터의 큰 덩어리가 가을 압축되고 있다는 사실은 우리가 일부 입력 (tinier 덩어리)를 취할 수 있다는 것을 의미가 다음에 어떤 알고리즘을 적용 원래 데이터를 다시 출력합니다. 이 경우 스레드 안전은 의무 사항이 아닙니다. 이 클래스의 초기 데이터 (확장되지 않은 바이트)는 수행 할 추가 계산 (바이트 호출 제거, 문자 추가, 변경)에 관계없이 격리 된 상태로 유지 될 수 있습니다. 결국, 큰 데이터 덩어리는 그대로 압축 해제 될 준비가되어 있습니다.
소스 코드를 보면 코드가 synchronized
이며 스레드로부터 안전하다는 것을 알 수 있습니다.
그러나, synchronized
그것은 스레드 안전 그래서 비록 하나의 Deflater
/Inflator
예는, 한 번에 하나 개의 작업을 수행 할 수 있다는 것을 의미, 그것은 여러 스레드가 그것을 사용하려고하면, 즉 그것이 병목 멀티 스레드됩니다 아니다 동시.
예, 스레드로부터 안전하지만 다중 스레드를 실행하면 성능 이점이 줄어들어 스레드간에 인스턴스를 공유하면 안됩니다. 당신은 synchronized
생각
예 코드를 살펴 보았지만 동기화와는 달리 보이지만 byte [] buf, ZStreamRef zsRef 등과 같은 클래스에서 공유 상태가있는 것 같습니다. 같은 inflator/deflator 인스턴스가 여러 스레드에서 동시에 사용되면이 공유 상태로 인해 아무 문제도 발생하지 않을지 확실하지 않습니다. – tarunkumar
왜 신경 쓰시겠습니까? 호기심이 아니라는 뜻인가요? 매번 새로운 것을 만드는 데 문제가 있습니까? 그렇지 않다면 [조기 최적화]를하지 마십시오 (http://stackoverflow.com/q/385506/5221149). – Andreas