是否有一个;“私人”;修改器还可以确保Java中的线程安全
通过阅读Brain Goetz关于安全构造技术的优秀文章,我被清单5中给出的一条评论弄糊涂了。以下是代码片段:是否有一个;“私人”;修改器还可以确保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; //
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是私有的,线程为什么可以访问它?