私は、デフラータ用のJava提供コードを見ていますをご覧ください。ネイティブで作成された
ZStreamRef
オブジェクトにアクセスするすべてのメソッドは、そのオブジェクトへのアクセスを同期させることに気付きました。例えば:
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
がスレッドセーフであるとは言及していません。オブジェクトにアクセスする前にネイティブに作成されたオブジェクトを同期する必要がありますか?
ベストアンサー
ドキュメントには、スレッドセーフである必要があるとは記載されておらず、すべてのプラットフォームでスレッドセーフではない可能性があります。しかし、OpenJDKではそうです。しかし、ステートフルとしては非常に便利で、スレッド間でストリームを共有するためには外部ロックがほとんど必要です。
(私はそれが良い考えであると疑う)