point[][]初始化_Java多线程 未完成初始化就把对象提供给外界-this赋值

对象未完成初始化就把对象提供给外界

如下的情况, 都是对象未完成初始化就把对象提供给外界

f329d26c67446472396498a5667f4657.png

构造函数中未初始化完毕就this赋值

如下的代码中, 演示了构造函数中未初始化完毕就this赋值 .

package com.thread.background;/** * 类名称:NotInitFinishedThis * 类描述: 演示初始化未完毕,就this赋值 * * @author: https://javaweixin6.blog.csdn.net/ * 创建时间:2020/9/1 19:58 * Version 1.0 */public class NotInitFinishedThis {    static Point point ;    public static void main(String[] args) throws InterruptedException {        new PointMaker().start();        //Thread.sleep(10);        Thread.sleep(105);        if (point != null) {            System.out.println(point);        }    }}/*** * 描述坐标的内部类 */class Point{    //x y  代表坐标轴的x  y轴    private final int x,y;    public Point(int x, int y) throws InterruptedException {        this.x=x;        //在给x y 赋值的时候, 给this 赋值        NotInitFinishedThis.point = this;        Thread.sleep(100);        this.y = y ;    }    @Override    public String toString() {        return "Point{" +                "x=" + x +                ", y=" + y +                '}';    }}class PointMaker extends Thread {    @Override    public void run() {        try {            new Point(1,1);        } catch (InterruptedException e) {            e.printStackTrace();        }    }}

主要是在Point类的构造方法中, 如下的代码, 在给x y赋初始化值的时候, 未初始化完毕就this赋值.
即 NotInitFinishedThis.point = this

51155d32d0c45f7485783481bbd04f2b.png


那么导致的后果就是 如下的这个线程启动 ,调用Point类的构造方法的时候, 可能刚把x赋值完毕, y还没来得及赋值为 1 , 就被cpu线程调度给切换走了.

d73de297eba25965c7d04aaa86e1ec40.png


休眠10ms时, 运行结果如下 :

c537310861ca6daaeb95ce41d5e93183.png


休眠105ms时, 运行结果如下, 与休眠10ms时的结果不同, 说明出现了线程不安全的问题 . 主要的原因是过早的把Point对象用this发布出去了, 而理想的情况是Point对象, 一旦发布就应该是一个固定的对象, 是一个完整的, 没有瑕疵的对象,可是如果仅仅是因为时间的不同就打印出不同的结果, 就是线程安全问题. .

78eb99afb48e0aceaa33c4fe8da29452.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值