我试图在有效不可变类的情况下理解安全发布。对于我的班级,我无法想出一个线程不安全的场景。我需要添加一些其他安全的gaurd吗?
澄清:容器元素是线程安全的
function loadDetail(id) {
$.ajax({
async: false,
url: '/script.php',
data: { 'id' : id },
success: function(response){
$('#detailModal-content').html(response);
}
});
}
答案 0 :(得分:1)
这看起来不错,只要 static Container shared; // not volatile
// thread 1
shared = containerX.add( e );
// thread 2
shared.peek();
不安全发布(我们绝不应该这样做)。
但是,为了便于讨论,我们假设一个Container对象通过不安全的发布传递
final
这不是线程安全的;线程2可以观察到腐败状态。
要解决这个问题,我们需要other_cont
变量;并且所有写入都应该在构造函数退出之前完成。在您的代码中,您可以在new Container
之后修改 public class Container<E> {
final private LinkedList<E> data;
public Container() {
this.data = new LinkedList<E>();
}
Container(LinkedList<E> data) {
this.data = data;
}
public Container<E> add(E e) {
LinkedList<E> copy = new LinkedList<>(data);
copy.add( e );
return new Container<>(copy);
}
... etc
,这就是问题所在。
就个人而言,我会这样做
final
设计不可变类的经验法则 - 所有字段必须为git checkout -b myNewBranch
,并且所有写入必须在构造函数退出之前完成。