this指针逃逸问题
this指针逃逸是指在构造函数返回之前,其他线程已经就持有了该对象的应用,产生的结果自然和预期可能会产生差异。
常见的this指针逃逸,在并发编程实战一书中,作者指出:在构造函数中注册事件监听,在构造函数中启动新线程。
由于注册事件,并没有用过,因此以线程为例说明问题。:
public class TestEscape
{
private String name; public TestEscape(String name) throws InterruptedException
{ new Thread(new EscapeRunnable()).start();
// Thread.sleep(1); //增加构造函数的负责度,加长name初始化时间,否则在测试过程中,并没有发生其为null的情况
this.name = name; } private class EscapeRunnable implements Runnable
{
@Override
public void run()
{
System.out.println(name);
}
} public static void main(String[] args) throws InterruptedException
{
new TestEscape("woniu");
}
}
解决办法是,不在线程中启动线程或者注册事件,将线程的启动在初始化完成后,再次进行启动。
public class TestEscape
{
private String name;
private Thread thread; public TestEscape(String name) throws InterruptedException
{ thread = new Thread(new EscapeRunnable());
Thread.sleep(1); //增加构造函数的负责度,加长name初始化时间,否则在测试过程中,并没有发生其为null的情况
this.name = name; } public void init()
{
thread.start();
} private class EscapeRunnable implements Runnable
{
@Override
public void run()
{
System.out.println(name);
}
} public static void main(String[] args) throws InterruptedException
{
//由于已经将构造函数初始化完成,其后调用的方法,均可以正常执行,与预期无差异。
new TestEscape("woniu").init();
}
}
this指针逃逸问题的更多相关文章
- JVM笔记-逃逸分析
参考: http://www.iteye.com/topic/473355http://blog.sina.com.cn/s/blog_4b6047bc01000avq.html 什么是逃逸分析(Es ...
- Golang逃逸分析
Golang逃逸分析 介绍逃逸分析的概念,go怎么开启逃逸分析的log. 以下资料来自互联网,有错误之处,请一定告之. sheepbao 2017.06.10 什么是逃逸分析 wiki上的定义 In ...
- go逃逸分析
目录 1. 前言 2. 逃逸策略 3. 逃逸场景 3.1 指针逃逸 3.2 栈空间不足逃逸 3.3 动态类型逃逸 3.4 闭包引用对象逃逸 4 逃逸总结 5. 注意事项 1. 前言 所谓的逃逸分析(E ...
- 详解synchronized与Lock的区别与使用
知识点 1.线程与进程 在开始之前先把进程与线程进行区分一下,一个程序最少需要一个进程,而一个进程最少需要一个线程.关系是线程–>进程–>程序的大致组成结构.所以线程是程序执行流的最小单位 ...
- 【JAVA面试】java面试题整理(4)
版权声明:转载请注明 https://blog.csdn.net/qq_33591903/article/details/83473779 ...
- JVM--理解介绍
JVM?JDK?JRE?关系? JDK(Java Development Kit),它是实际上存在的,它包含JRE+编译.运行等开发工具. JRE(Java Runtime Environment), ...
- Golang 性能优化实战
小结: 1. 性能查看工具 pprof,trace 及压测工具 wrk 或其他压测工具的使用要比较了解. 代码逻辑层面的走读非常重要,要尽量避免无效逻辑. 对于 golang 自身库存在缺陷的,可以寻 ...
- gc垃圾回收算法原理
目录 三色标记法 标记-清扫(Mark And Sweep)算法 标记-清扫(Mark And Sweep)算法存在什么问题? 三色并发标记法 gc和用户逻辑如何并行操作? 进程新生成对象的时候,GC ...
- 抓到 Netty 一个隐藏很深的内存泄露 Bug | 详解 Recycler 对象池的精妙设计与实现
欢迎关注公众号:bin的技术小屋,如果大家在看文章的时候发现图片加载不了,可以到公众号查看原文 本系列Netty源码解析文章基于 4.1.56.Final版本 最近在 Review Netty 代码的 ...
随机推荐
- 判断变量是否为 NaN
首先要明确 NaN 的一个特性, NaN不能用相等操作符(== 和 ===) 来判断, NaN === NaN 会返回 false: 下面是测试代码: console.log(isNaN('1')) ...
- JCenter下载太慢?教你修改Maven仓库地址为国内镜像
http://blog.csdn.net/biezhihua/article/details/49668605 转载自:http://www.yrom.net/blog/2015/02/07/chan ...
- 【HTML5校企公益课】第一天
1.搭建基本的开发环境.学校电脑用的是浏览器是Chrome,编辑器是HBuilder. 2.初步介绍HTML5的Web项目基本结构. css:样式表 img:存放图片 js:存放脚本文件 .html: ...
- flume从log4j收集日志输出到kafka
1. flume安装 (1)下载:wget http://archive.cloudera.com/cdh5/cdh/5/flume-ng-1.6.0-cdh5.7.1.tar.gz (2)解压:ta ...
- 《JAVA程序设计》第五次实验报告
20145333 实验五 Java网络编程及安全 北京电子科技学院(BESTI)实验报告 课程:Java程序设计 班级:1453 指导教师:娄嘉鹏 实验日期:2016.05.06 18:30-21:3 ...
- Maven项目mybatis Invalid bound statement (not found)解决方法
最近因为工作需要,要学习mybatis框架.在添加好一些依赖之后,通过mybatis进行数据库的crud操作.但是在测试的时候总是报mybatis:Invalid bound statement (n ...
- HDFS并行复制Distcp
1)Distcp(分布式拷贝)是用于大规模集群内部和集群之间拷贝的工具. 2)distcp命令是以MR作业(没有R任务)的形式实现的,把文件和目录的列表作为M任务的输入.每一个文件是由一个M任务来拷贝 ...
- Metasploit 学习
知识准备:CCNA/CCNP基础计算机知识框架:操作系统.汇编.数据库.网络.安全 木马.灰鸽子.口令破解.用后门拷贝电脑文件 渗透测试工程师 penetration test engineer &l ...
- [Pytorch]PyTorch使用tensorboardX(转
文章来源: https://zhuanlan.zhihu.com/p/35675109 https://www.aiuai.cn/aifarm646.html 之前用pytorch是手动记录数据做图, ...
- 单元测试 使用 Effort 内存数据库 报错
单元测试中 使用 Effort 内存数据库,可能会遇到两个错误: 1. :“No Entity Framework provider found for the ADO.NET provider wi ...