我在 Java 中有一个原子布尔属性
private AtomicBoolean endOfInputDataSet;
该属性的正确 getter 和 setter 是什么?每种选择的后果是什么?我可以直接退货
AtomicBoolean
public AtomicBoolean getEndOfInputDataSet() {
return this.endOfInputDataSet;
}
public void setEndOfInputDataSet(AtomicBoolean endOfInputDataSet) {
this.endOfInputDataSet = endOfInputDataSet;
}
或者我可以退回未包装的
boolean
:
public boolean getEndOfInputDataSet() {
return this.endOfInputDataSet.get();
}
public void setEndOfInputDataSet(boolean endOfInputDataSet) {
this.endOfInputDataSet.set(endOfInputDataSet);
}
我认为后一种解决方案只是让客户端使用更简单,更干净,但是为什么IntelliJ生成getter和setter时不是默认的?
私有 AtomicBoolean 输入数据集结束;
制作该
final
以防止另一个 AtomicBoolean
取代原来的。
返回 this.endOfInputDataSet;
原子…对象是携带有效负载的容器,同时提供对该有效负载的线程安全访问。
此行返回对该容器的引用。然后,调用程序员可以获取或设置该有效负载的内容。
this.endOfInputDataSet = endOfInputDataSet;
这条线破坏了你的场景。您使调用程序员能够替换您的容器。
返回 this.endOfInputDataSet.get();
此行返回容器内容的副本。
请注意,这一行的方法返回“旧消息”。在
get()
调用结束和调用程序员实际收到值之间有一个时间节拍。在此节拍期间,另一个线程可能在原子容器上执行了 set
,从而更改了容器的内容。您已撤消“Atomicin
AtomicBoolean”。这段代码不是线程安全的。
this.endOfInputDataSet.set(endOfInputDataSet);
这一行是非原子且线程不安全的,与上面的行一样。