0

阅读Brain Goetz 的这篇关于安全构造技术的优秀文章后,我对清单 5 中给出的评论感到困惑。下面是代码片段:

public class Safe { 

 private Object me;
 private Set set = new HashSet();
 private Thread thread;

 public Safe() { 
 // Safe because "me" is not visible from any other thread
 me = this;

// Safe because "set" is not visible from any other thread
 set.add(this);

// Safe because MyThread won't start until construction is complete
// and the constructor doesn't publish the reference
   thread = new MyThread(this);
}

public void start() {
   thread.start();
 }

private class MyThread(Object o) {

private Object theObject;

public MyThread(Object o) { 
  this.theObject = o;
}

...
 }
}

他为什么要这么说me// Safe because "me" is not visible from any other thread. 两个线程不能同时访问实例变量me吗?

4

3 回答 3

3

唯一的一点是,在构造函数运行时,您不会通过将其设置为私有属性来泄漏this。在构造函数完成并且调用者接收到this对象的引用之后,显然也是me引用,它可以将它发布到任何线程,因此它确实可以被任何线程访问。但这不是 Goetz 的重点。

于 2012-07-02T08:31:53.083 回答
0

private修饰符本身并不能确保线程安全。但是,其他线程无法访问/查看您的对象是什么。在这里,实例Safe被传递给 MyThread,并且没有被存储/暴露在其他地方。

于 2012-07-02T08:24:16.857 回答
0

请注意有关此代码的以下几点:

  1. meprivate
  2. 没有其他公共方法间接允许访问me外部代码。

    这两者一起允许me参考的线程安全。如果该类被重新设计为具有另一个公共方法,如下所示:

public Safe someMethodForPublicAcess(){ return me; }

然后线程安全就消失了,即使成员meprivate. 发生这种情况是因为外部代码现在可以调用这个公共方法并传递me给多个线程,这些线程可以做任何他们喜欢的事情。

于 2012-07-02T09:09:03.047 回答