这个Class线程安全吗?如果没有人可以解释一个场景?

时间:2015-05-13 02:30:52

标签: java multithreading thread-safety safe-publication

我试图在有效不可变类的情况下理解安全发布。对于我的班级,我无法想出一个线程不安全的场景。我需要添加一些其他安全的gaurd吗?

澄清:容器元素是线程安全的

function loadDetail(id) {
   $.ajax({
      async: false,
      url: '/script.php',
      data: { 'id' : id },
      success: function(response){
         $('#detailModal-content').html(response);
      }
  });
}

1 个答案:

答案 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 ,并且所有写入必须在构造函数退出之前完成。