2017-03-15 8 views
0

클래스 중 하나에서 우리는 수천 개의 압축 형식 압축, 동시 스레드에서 압축 풀기를 수행하고 있습니다.java.util.zip.Deflater 및 java.util.zip.Inflater 클래스 스레드 안전성

모든 압축/압축 풀기는 각각 Deflater & Inflater의 새 인스턴스를 만들어 수행합니다.

이러한 클래스가 스레드로부터 안전 할 경우 설명서를 찾을 수 없습니다. 모든 포인터가 도움이 될 것입니다.

+2

왜 신경 쓰시겠습니까? 호기심이 아니라는 뜻인가요? 매번 새로운 것을 만드는 데 문제가 있습니까? 그렇지 않다면 [조기 최적화]를하지 마십시오 (http://stackoverflow.com/q/385506/5221149). – Andreas

답변

0

이러한 클래스는 스레드 안전 이유입니다,하지만 난 당신이 천천히 그것에 대해 생각하고 스스로 답 찾으려면 :

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 덩어리)를 취할 수 있다는 것을 의미가 다음에 어떤 알고리즘을 적용 원래 데이터를 다시 출력합니다. 이 경우 스레드 안전은 의무 사항이 아닙니다. 이 클래스의 초기 데이터 (확장되지 않은 바이트)는 수행 할 추가 계산 (바이트 호출 제거, 문자 추가, 변경)에 관계없이 격리 된 상태로 유지 될 수 있습니다. 결국, 큰 데이터 덩어리는 그대로 압축 해제 될 준비가되어 있습니다.

1

소스 코드를 보면 코드가 synchronized이며 스레드로부터 안전하다는 것을 알 수 있습니다.

그러나, synchronized 그것은 스레드 안전 그래서 비록 하나의 Deflater/Inflator 예는, 한 번에 하나 개의 작업을 수행 할 수 있다는 것을 의미, 그것은 여러 스레드가 그것을 사용하려고하면, 즉 그것이 병목 멀티 스레드됩니다 아니다 동시.

예, 스레드로부터 안전하지만 다중 스레드를 실행하면 성능 이점이 줄어들어 스레드간에 인스턴스를 공유하면 안됩니다. 당신은 synchronized 생각

+0

예 코드를 살펴 보았지만 동기화와는 달리 보이지만 byte [] buf, ZStreamRef zsRef 등과 같은 클래스에서 공유 상태가있는 것 같습니다. 같은 inflator/deflator 인스턴스가 여러 스레드에서 동시에 사용되면이 공유 상태로 인해 아무 문제도 발생하지 않을지 확실하지 않습니다. – tarunkumar