java - 克服 Java 中的不当发布
问题描述
我在“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;
如果您愿意,您还可以为该字段添加一个公共(非synchronized
)getter 方法。Holder.n
没有什么可以使用的私有字段没有什么意义。
(但要摆脱它,assertSanity
因为它在世上没有用处。)
完成上述操作后,该字段Holder
将是不可变的n
,您不必担心该字段的不安全发布。
推荐阅读
- json - 从打字稿中的.json文件中提取数据
- java - Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 7 for correctly indexed array
- amazon-web-services - 从 Amazon S3 下载文件到 lambda 并解压
- python - 指向 Python 子字符串的指针:memoryview vs itertools.islice vs ...?
- react-native - 我怎样才能让多个按钮同时工作?在 React Native 中
- r - 创建一个从数据生成图的函数
- java - 使用 ViewPager 时如何运行按钮的正常功能
- ruby-on-rails - 在保存之前验证必须通过另一个模型运行的 Rails 表单字段
- c# - Declare a List of class references
- makefile - how my makefile aotumatically change .o prerequisite to .c targets?