2011-11-13 13 views
2

私はDeflaterのJavaのコードを見ています。ネイティブに作成されたZStreamRefオブジェクトにアクセスするすべてのメソッドは、そのオブジェクトへのアクセスを同期させることに気付きました。たとえば:まだ作成されたJavaオブジェクトは、アクセスのためにネイティブに同期する必要がありますか?

public void setLevel(int level) { 
if ((level < 0 || level > 9) && level != DEFAULT_COMPRESSION) { 
    throw new IllegalArgumentException("invalid compression level"); 
} 
    synchronized (zsRef) { 
     if (this.level != level) { 
      this.level = level; 
      setParams = true; 
     } 
    } 
} 

、JavadocはDeflaterは、スレッドセーフであることを言及していません。オブジェクトにアクセスする前にネイティブに作成されたオブジェクトを同期する必要がありますか?

答えて

2

ドキュメントには、スレッドセーフである必要があるとは記載されておらず、すべてのプラットフォームでスレッドセーフではない可能性があります。しかし、OpenJDKではそうです。しかし、ステートフルとしては非常に便利で、スレッド間でストリームを共有するためには外部ロックがほとんど必要です。 (私は良いアイデアを疑う)

0

私はそれがスレッドセーフではないと信じて、いくつかの内部状態を保持する必要があります。 私はいくつかのテストを試して、大量の(20Mb以上の)データセットを多数のスレッドにわたって圧縮して失敗していることを一貫して見ています(そのうちいくつかはdeflateが0を返します)。 (JavaSE-1.6を実行中)

関連する問題