有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

本机创建的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是线程安全的。是否要求在访问本机创建的对象之前对其进行同步


共 (2) 个答案

  1. # 1 楼答案

    文档中没有说明它需要线程安全,并且它可能在所有平台上都不是线程安全的。然而,在OpenJDK中它是。但是,不确定它是否非常有用,因为它是有状态的,并且几乎肯定需要外部锁定来在线程之间共享流。(我怀疑这是个好主意)

  2. # 2 楼答案

    我认为它不是线程安全的,必须保持某种内部状态。 我已经尝试了一些测试,并始终看到跨多个线程压缩大型(>;20Mb)数据集失败(在其中一些线程中,deflate返回0)。 (运行JavaSE-1.6)