在创建外部对象之前访问Java线程

用户3363135:

是的,这是一个学术性问题,我知道人们会抱怨我没有发布任何代码,但我确实对这个问题感到震惊,真的不知道从哪里开始。我真的很感谢一个解释,也许还有一些代码示例。

如果对象构造函数启动了一个新线程,该线程执行匿名内部类对象的方法运行,则此新线程可能会在其完全构造并且其字段完全初始化之前可以访问其周围的外部对象。您如何防止这种情况发生?

拉斐尔:

这称为“泄漏”。这里有代码

public class Test {

  // this is guaranteed to be initialized after the constructor
  private final int val;

  public Test(int v) {
    new Thread(new Runnable() {
      @Override public void run() {
        System.out.println("Val is " + val);
      }
    }).start();
    this.val = v;
  }

}

猜猜它将打印什么(可能是线程)。我使用一个final字段来强调对象已完全初始化之前已被访问(最终字段必须在每个构造函数的最后一行之后明确分配

你如何恢复

this在构造函数中时,您不想传递这也意味着您不希望在完全相同的类(非静态,非私有)中调用非最终虚拟方法,并且不使用隐式链接到封装的内部类(匿名类是内部类)实例,因此他们可以访问this

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

由静态对象创建的线程在DTor之前被删除?

Java访问不同线程中的对象

将对象传递给线程(在线程外部访问对象)

Java内部类-访问外部对象的变量

如何创建从线程查询的全局可访问对象的持久列表?

Tkinter访问由循环外部的Loop创建的Canvas对象

调用线程无法访问从同一线程创建的对象

允许在 UI 线程上访问在后台线程上创建的对象

检测创建对象的线程

Android:从不正确的线程访问领域。Realm 对象只能在创建它们的线程上访问

只能在创建对象的线程上访问领域对象_ Volley和AsyncTask

是否在构造函数被调用之前在堆上创建的Java对象?

如何通过使用Java中的线程创建多个掉落的对象?

在多线程环境中,对象创建是否是Java的瓶颈?

在java中限制多线程中对象的创建

值得多线程在 Java 中创建新对象吗?

从创建线程之外的线程访问控件

从多个线程访问类对象

Java线程对象与运行线程

C ++:释放在构造函数中所需的屏障,该构造函数创建访问构造对象的线程

在notifyAll()之前,同步对象未被线程锁定

强制线程在销毁之前离开对象

创建线程之前的Pthread关联

java.lang.IllegalMonitorStateException:对象在wait()之前没有被线程锁定?

Java-for循环中的线程不会在上一个线程完成之前创建

在函数外部访问对象变量

从Android中的UI线程外部访问GoogleMap

访问ThreadStatic-线程外部的变量

如何从线程内访问外部属性