我正在查看 Java 为 Deflater 提供的代码.我注意到所有 Access native 创建的 ZStreamRef
对象的方法都在同步 Access 它。例如:
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
是线程安全的。是否需要在 Access 之前同步 native 创建的对象?
最佳答案
文档没有说明它需要是线程安全的,而且它可能不是在所有平台上都是线程安全的。但是在 OpenJDK 中是这样。不确定它是否非常有用,但是因为它是有状态的并且几乎肯定需要外部锁定才能在线程之间共享流。 (我怀疑这是个好主意)
关于java - native 创建的 Java 对象是否需要同步才能 Access ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8110250/