对象未完成初始化就把对象提供给外界--构造方法中新建线程

如下的代码 ,演示了 构造方法中新建线程 . 例如给map赋值.
之后在main方法调用中, 尝试获取map中,对应key的值

package com.thread.background;import java.util.HashMap;import java.util.Map;/** * 类名称:ConstructNewThread * 类描述: 构造方法中新建线程 * * @author: https://javaweixin6.blog.csdn.net/ * 创建时间:2020/9/1 21:40 * Version 1.0 */public class ConstructNewThread {    //定义一个private私有变量    private Map states ;    public ConstructNewThread() {        //在子线程中, 对map进行赋值        new Thread(()->{            states = new HashMap<>();            states.put("1","a");            states.put("2","b");            states.put("3","c");        }).start();    }    //对象逸出  返回了一个私有变量    public Map getStates() {        return states;    }    public static void main(String[] args) throws InterruptedException {        ConstructNewThread re = new ConstructNewThread();        Map states = re.getStates();        //map中获取值        System.out.println(states.get("1"));    }}

此时运行程序, 得到的结果却是空指针.
主要的原因是, map中赋值, 是新建立的线程. 而在执行re.getStates()的时候, 此时子线程还没获得cpu的执行权,导致map中是空的值. 尝试获取值就是null .

修改代码, main线程中休眠10ms ,让出cpu 的资源去初始化map 的值, 这个时候运行程序,就没有报错了. 成功的获得了值. 因此这样在构造方法中新建线程也是造成线程不安全的原因之一.

此种情况可以用工厂模式解决. 后续的文章中会写到.

虽然在开发中不会在构造方法中去新建立线程 ,但是获取某个资源的时候, 例如线程池的引用或者是数据库的连接池, 在获取连接池的时候, 底层的代码是会去新建立线程以加快速度的. 这样是隐含的在构造方法中新开线程,就容易造成线程安全问题.

c++ map初始化_Java多线程 未完成初始化--构造方法中新建线程相关推荐

  1. java类的静态成员初始化_Java类的初始化顺序 (静态变量、静态初始化块、变量、初始......

    很有意思的一篇文章 1.没有继承 静态变量->静态初始化块->变量->变量初始化块->构造方法 2.有继承的情况 父类静态变量->父类静态初始化块->子类静态变量- ...

  2. java 类 加载 初始化_java中类的初始化和加载

    最近在阅读孙卫琴的java面向对象一书中,看到对java中类的初始化和加载中的论述比较系统,故笔记之 1)类的初始化,JAVA在初始化一个类时,以下步骤 A 假如类存在直接的父类,并且这个父类还没有初 ...

  3. Java中Thread中的实例方法_Java多线程2:Thread中的实例方法

    Thread类中的方法调用方式: 学习Thread类中的方法是学习多线程的第一步.在学习多线程之前特别提出一点,调用Thread中的方法的时候,在线程类中,有两种方式,一定要理解这两种方式的区别: 1 ...

  4. java中thread实例_Java多线程2:Thread中的实例方法

    Thread类中的方法调用方式: 学习Thread类中的方法是学习多线程的第一步.在学习多线程之前特别提出一点,调用Thread中的方法的时候,在线程类中,有两种方式,一定要理解这两种方式的区别: 1 ...

  5. 操作系统多线程实现_操作系统中的线程实现

    操作系统多线程实现 Each process has an address space. There is one thread of control in every traditional OS. ...

  6. Java多线程编程(1)--Java中的线程

    一.程序.进程和线程   程序是一组指令的有序集合,也可以将其通俗地理解为若干行代码.它本身没有任何运行的含义,它只是一个静态的实体,它可能只是一个单纯的文本文件,也有可能是经过编译之后生成的可执行文 ...

  7. java 接口初始化_Java类的初始化 | 学步园

    类的初始化时机1.创建类的实例 2.访问类或接口的静态变量(static final常量除外,static final变量可以)3.调用类的静态方法 4.反射(Class.forName(packag ...

  8. java 虚拟机 初始化_Java虚拟机 类初始化 阶段

    Java虚拟机使用某个类的过程,可分为七个阶段: 加载 - 验证 - 准备 - 解析 - 初始化 - 使用 - 卸载 本文只介绍在什么情况下对类进行初始化. Java虚拟机规范对何时进行类的初始化做了 ...

  9. java成员变量的初始化_Java成员变量初始化过程

    import java.util.*; public class Main { public static void main(String[] args){ Student s = new Stud ...

最新文章

  1. go语言打印日期_判定是否掌握Go语言的最重要标准:对并发的掌握
  2. Spring注解开发-属性依赖注入指定名称的bean
  3. 电脑重启bootmgr_电脑系统启动:显示0xc0000428怎么办
  4. np.expm1_JavaScript中带有示例的Math.expm1()方法
  5. 2020腾讯二次元营销通案
  6. android 仿QQ手机版
  7. I00030 Grades conversion
  8. 计算机硬盘转速多少比较好,电脑硬盘的转速是什么意思?越快就越好么?
  9. php utc 北京时间,美国各个时区转换成北京时间 utc gmt
  10. 【网络】MTU理解、MTU对上层协议的影响
  11. 答应了邮件offer还能反悔吗?
  12. openwrt-wps功能的实现(一)
  13. 小程序常用的十个入口
  14. r语言中残差与回归值的残差图_独家 | 手把手教你用R语言做回归后的残差分析(附代码)-阿里云开发者社区...
  15. Dev的panelcontrol
  16. 练习:JSP相关试题
  17. 【软件安装故障排除】安装完PyCharm,启动时弹出“Failed to load JVM DLL\bin\server\jvm.dll“解决方案
  18. iis php 缓存时间,推荐 IIS7.0下ThinkPHP提示“缓存文件写入失败!” 需要设置user的权限即可 Home/Runtime/Cache/...
  19. Java核心编程总结(三、多态与内部类),java就业班百度网盘
  20. 一步一步教你用 Python 开发战棋游戏,仿英雄无敌

热门文章

  1. Day04 dom详解及js事件
  2. PathAnimation
  3. spring - ioc和aop
  4. XP和win7的软件崩溃提示
  5. OpenGL与EGL最简流程(十八)
  6. android启动过程之init.rc文件浅析
  7. tensorflow之get_shape
  8. 关于linux文件权限的说明
  9. Vue打包时报错:ReferenceError: primordials is not defined
  10. koa2 导出excel表格设置样式_一调整Excel表格的行列宽度,图片又得重新调整?点这个设置就行...