2011-11-13 44 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)