2011-11-13 47 views
2

我正在看看Java的交付代码Deflater。我注意到访问本地创建的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)的数据集失败(其中一些线程放气返回0)。 (运行JavaSE-1.6)