加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 将此(在构造函数中)泄露给对象本身

发布时间:2020-12-15 04:28:39 所属栏目:Java 来源:网络整理
导读:我从其他问题中了解到,如果另一个对象有机会利用仍处于构造中的对象(我们泄露的对象),在单线程和多线程环境中,如何泄漏这可能是不安全的. 我的问题是,如果我将物体泄漏给自己怎么办? public Category(int id,String name) { this.id = id; this.name = name
我从其他问题中了解到,如果另一个对象有机会利用仍处于构造中的对象(我们泄露的对象),在单线程和多线程环境中,如何泄漏这可能是不安全的.

我的问题是,如果我将物体泄漏给自己怎么办?

public Category(int id,String name) {
    this.id = id;
    this.name = name;
    this.idPadre = this;
}

请注意,在构造函数的最后一行中,我正在泄漏对象.这通常仍然是不安全的,因为构造函数可以继承并在执行父类的构造函数(这是我写过的)之后使用带有更多代码的super()调用,从而使泄漏行不是最后一行施工过程.

但是,如果继承类仍然在其构造函数中,那么即使它正在泄漏正在构造的对象并且更多行代码跟随泄漏行,它仍然是不安全的,考虑到可以访问泄漏对象的唯一上下文是那个对象的构造函数(还没有完成执行)?

问题也代表多线程环境.我很确定它是线程安全的,因为对象被泄露给它自己(它的一个字段)并且在构造函数完成之前无法访问这些字段.根据能够访问泄漏对象的构造函数,构造函数只能在一个线程中运行,因此它应该是线程安全的(如果它在这个问题的第一部分引用的方面也是安全的).

我想以一般方式提出这个问题.但这是我发现这种情况的背景.该类是一个实体类,我使用ORMLite持久化到关系数据库.数据库表有一列,其值指向该条目的类别的父级.如果Category没有父类,则它本身就是它的父类(列idPadre的值与列id的值相同).使用ORMLite的注释编写实体类时,这意味着该对象具有对自身的引用. ORMLite的使用以及我希望尽可能简化所有实体类的原因是我不首先倾向于用工厂方法解决这个问题的原因.

解决方法

当您将其分配给字段idPadre时,如果您已经拥有对该对象的引用以访问该字段,则只能访问该对象.换句话说,你没有泄露任何尚未被构造函数调用者泄露的东西,可以这么说.

泄漏这通常意味着在构造函数完成之前从构造函数中泄漏对象的引用.从构造函数中泄漏此问题的问题是字段可能尚未正确初始化.这不是一个问题,因为你只能在构造函数完成后访问idPadre(除非你之前已经在构造函数中泄露了 – 但是你已经泄露了这个!)

如果idPadre是一个静态字段,那么这确实会泄漏这个,因为其他线程可以随时访问静态字段.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读