c++ map初始化_Java多线程 未完成初始化--构造方法中新建线程
对象未完成初始化就把对象提供给外界--构造方法中新建线程
如下的代码 ,演示了 构造方法中新建线程 . 例如给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多线程 未完成初始化--构造方法中新建线程相关推荐
- java类的静态成员初始化_Java类的初始化顺序 (静态变量、静态初始化块、变量、初始......
很有意思的一篇文章 1.没有继承 静态变量->静态初始化块->变量->变量初始化块->构造方法 2.有继承的情况 父类静态变量->父类静态初始化块->子类静态变量- ...
- java 类 加载 初始化_java中类的初始化和加载
最近在阅读孙卫琴的java面向对象一书中,看到对java中类的初始化和加载中的论述比较系统,故笔记之 1)类的初始化,JAVA在初始化一个类时,以下步骤 A 假如类存在直接的父类,并且这个父类还没有初 ...
- Java中Thread中的实例方法_Java多线程2:Thread中的实例方法
Thread类中的方法调用方式: 学习Thread类中的方法是学习多线程的第一步.在学习多线程之前特别提出一点,调用Thread中的方法的时候,在线程类中,有两种方式,一定要理解这两种方式的区别: 1 ...
- java中thread实例_Java多线程2:Thread中的实例方法
Thread类中的方法调用方式: 学习Thread类中的方法是学习多线程的第一步.在学习多线程之前特别提出一点,调用Thread中的方法的时候,在线程类中,有两种方式,一定要理解这两种方式的区别: 1 ...
- 操作系统多线程实现_操作系统中的线程实现
操作系统多线程实现 Each process has an address space. There is one thread of control in every traditional OS. ...
- Java多线程编程(1)--Java中的线程
一.程序.进程和线程 程序是一组指令的有序集合,也可以将其通俗地理解为若干行代码.它本身没有任何运行的含义,它只是一个静态的实体,它可能只是一个单纯的文本文件,也有可能是经过编译之后生成的可执行文 ...
- java 接口初始化_Java类的初始化 | 学步园
类的初始化时机1.创建类的实例 2.访问类或接口的静态变量(static final常量除外,static final变量可以)3.调用类的静态方法 4.反射(Class.forName(packag ...
- java 虚拟机 初始化_Java虚拟机 类初始化 阶段
Java虚拟机使用某个类的过程,可分为七个阶段: 加载 - 验证 - 准备 - 解析 - 初始化 - 使用 - 卸载 本文只介绍在什么情况下对类进行初始化. Java虚拟机规范对何时进行类的初始化做了 ...
- java成员变量的初始化_Java成员变量初始化过程
import java.util.*; public class Main { public static void main(String[] args){ Student s = new Stud ...
最新文章
- go语言打印日期_判定是否掌握Go语言的最重要标准:对并发的掌握
- Spring注解开发-属性依赖注入指定名称的bean
- 电脑重启bootmgr_电脑系统启动:显示0xc0000428怎么办
- np.expm1_JavaScript中带有示例的Math.expm1()方法
- 2020腾讯二次元营销通案
- android 仿QQ手机版
- I00030 Grades conversion
- 计算机硬盘转速多少比较好,电脑硬盘的转速是什么意思?越快就越好么?
- php utc 北京时间,美国各个时区转换成北京时间 utc gmt
- 【网络】MTU理解、MTU对上层协议的影响
- 答应了邮件offer还能反悔吗?
- openwrt-wps功能的实现(一)
- 小程序常用的十个入口
- r语言中残差与回归值的残差图_独家 | 手把手教你用R语言做回归后的残差分析(附代码)-阿里云开发者社区...
- Dev的panelcontrol
- 练习:JSP相关试题
- 【软件安装故障排除】安装完PyCharm,启动时弹出“Failed to load JVM DLL\bin\server\jvm.dll“解决方案
- iis php 缓存时间,推荐 IIS7.0下ThinkPHP提示“缓存文件写入失败!” 需要设置user的权限即可 Home/Runtime/Cache/...
- Java核心编程总结(三、多态与内部类),java就业班百度网盘
- 一步一步教你用 Python 开发战棋游戏,仿英雄无敌
热门文章
- Day04 dom详解及js事件
- PathAnimation
- spring - ioc和aop
- XP和win7的软件崩溃提示
- OpenGL与EGL最简流程(十八)
- android启动过程之init.rc文件浅析
- tensorflow之get_shape
- 关于linux文件权限的说明
- Vue打包时报错:ReferenceError: primordials is not defined
- koa2 导出excel表格设置样式_一调整Excel表格的行列宽度,图片又得重新调整?点这个设置就行...