java - 克服 Java 中的不当发布

标签 java java.util.concurrent java-threads

我在《Java并发实践》一书中遇到了下面的类。作者指出,在下面的示例中,Holder 的状态可能会过时,从而在调用 assertSanity 时导致 AssertionError。如何使下面的 Holder 类变得不可变来克服这个问题?

public class Holder{

  private int n;

  public Holder(int n) { this.n = n;}

  public void assertSanity() {
     if(n != n)
          throw new AssertionError(" this statement is false");

  }

}

//unsafe publication
public Holder holder;

public void initialize(){
     holder = new Holder(42);
}

最佳答案

要使 Holder 类不可变,只需更改

  private int n;

  private final int n;

如果您愿意,您还可以为 Holder.n 字段添加公共(public)(非同步)getter 方法。拥有一个任何人都无法使用的私有(private)字段并没有多大意义。

(但是摆脱 assertSanity 因为它没有实际用途。)

完成上述操作后,Holder 对于 n 字段来说将是不可变的,并且您不必担心该字段的不安全发布。

关于java - 克服 Java 中的不当发布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64852284/

相关文章:

java - "NULL not allowed"有两个 @OneToMany 到同一个表

java - 是否可以在 PDFBOX 中调整文本?

java - 使用并发包中的同步器。 FutureTask 总是返回 null

java - 释放所有等待线程

java - Java中子线程如何向主线程(方法)发送连续的消息?

java - 使用 java LocalDateTime 进行 Scala 日期解析

java - 如何将通用对象转换为原始数组?

java - Java 中的按键阻塞映射

java - java.util.concurrent.LinkedBlockingQueue 中的奇怪代码

java - KafkaConsumer.close() 为什么?