我正在研究Java为Deflater提供的代码。我注意到访问本地创建的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
是线程安全的。是否需要在访问之前同步本机创建的对象?
答案 0 :(得分:2)
文档没有声明它需要是线程安全的,并且它可能在所有平台上都不是线程安全的。但是在OpenJDK中它是。不确定它是非常有用但是因为它有状态并且几乎肯定需要外部锁定来在线程之间共享流。 (我怀疑这是一个好主意)
答案 1 :(得分:0)
我认为它不是线程安全的,并且必须保持一些内部状态。 我已经尝试了一些测试并且始终看到在多个线程中压缩大(> 20Mb)数据集的失败(deflate在其中一些线程中返回0)。 (运行JavaSE-1.6)