对象发布和初始化时的线程安全问题

如何理解逸出?

  • 方法返回一个private对象
  • 还未完成初始化,构造函数还没完全执行完毕,就把对象提供给外界 如 :
  • 在构造函数中未初始化完毕就this赋值
  • 隐式逸出 --- 注册监听事件
  • 构造函数中运行线程

我们来看方法返回一个private对象的这种情况:

public class UnsafeStates {
    private String[] states = new String( ) {
        "AK", "AL" ...
    };
    public String[] getStates() {
       return states;
    }
}

如果按照上述方式来发布states,就会出现问题。因为任何调用者都能修改这个数组的内容。在这个示例中,数组states已经逸出了它所在的作用越,因为这个本应是私有的变量已经被发布了,作用越以外的任何地方都可以修改其内容。因此它存在安全隐患。

我们来看在构造函数中未初始化完毕就this赋值的这种情况

public class ThisEscape {

    static Point point;

    public static void main(String[] args) throws InterruptedException {
        new PointMaker().start();
        Thread.sleep(10000);
        // Thread.sleep(105);
        if (point != null) {
            System.out.println(point);
        }
    }
}

class Point {

    private final int x, y;

    public Point(int x, int y) throws InterruptedException {
        this.x = x;
        ThisEscape.point = this;
        Thread.sleep(100);
        this.y = y;
    }

    @Override
    public String toString() {
        return x + "," + y;
    }
}


class PointMaker extends Thread {

    @Override
    public void run() {
        try {
            new Point(1, 1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

通过执行以上代码,我们会发现,不同时间段的请求,执行结果并非一致。在ThisEscape中给出了逸出的一个特殊示例,既this引用在构造函数中逸出。当从对象的构造函数中发布对象时,只是发布了一个尚未构造完成的对象。如果this引用在构造过程中逸出,那么这种对象就被认为是不正确构造。

 

0人点赞

 

并发编程

 



作者:AD刘涛
链接:http://www.autono1.com/
来源:https://www.cnblogs.com/gquprn/ppt/13908191.html
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值