是否有一个;“私人”;修改器还可以确保Java中的线程安全

是否有一个;“私人”;修改器还可以确保Java中的线程安全,java,concurrency,synchronization,this,java.util.concurrent,Java,Concurrency,Synchronization,This,Java.util.concurrent,通过阅读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; //

通过阅读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”
。两个线程不能同时访问实例变量
me

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

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

唯一的一点是,当构造函数运行时,
通过将其设置为私有属性,不会泄漏此
。构造函数完成后,调用方收到对象的
this
引用(显然也是
me
引用)后,它可以将其发布到任何线程,因此任何线程都可以访问它。但这不是Goetz所说的重点。

唯一的一点是当构造函数运行时,
通过将其设置为私有属性,您不会泄漏此
。构造函数完成后,调用方收到对象的
this
引用(显然也是
me
引用)后,它可以将其发布到任何线程,因此任何线程都可以访问它。但这并不是Goetz所说的重点。

请注意以下关于此代码的要点:

  • me
    private
  • 没有其他公共方法间接允许外部代码访问
    me

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

  • public-Safe-somemethodforpubliccess(){
    还我;
    }


    即使成员
    me
    private
    ,线程安全性也会消失。之所以会发生这种情况,是因为外部代码现在可以调用此公共方法,并将
    me
    传递给多个线程,这些线程可以执行任意操作。

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

  • me
    private
  • 没有其他公共方法间接允许外部代码访问
    me

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

  • public-Safe-somemethodforpubliccess(){
    还我;
    }


    即使成员
    me
    private
    ,线程安全性也会消失。之所以会发生这种情况,是因为外部代码现在可以调用此公共方法并将
    me
    传递给多个线程,这些线程可以执行任意操作。

    me是私有的,线程为什么可以访问它?me是私有的,线程为什么可以访问它?