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