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 代码的 ...
随机推荐
- 使用selenium前学习HTML(2)——标签
<!-- HTML 标题(Heading)是通过 <h1> - <h6> 等标签进行定义的. HTML 段落是通过 <p> 标签进行定义的. HTML 链接是 ...
- 使用selenium前学习HTML介绍
<!-- HTML 是用来描述网页的一种语言. HTML 指的是超文本标记语言 (Hyper Text Markup Language) HTML 不是一种编程语言,而是一种标记语言 (mark ...
- mysql-community-server安装完后不知道root密码
修改方法: service mysqld stop mysqld_safe --skip-grant-tables & mysql -u root use mysql; update user ...
- DATETIME与TIMESTAMP
DATETIME与TIMESTAMP都能表达一个完整的日期格式:YYYY-MM-DD HH:MM:SS[.fraction] eg: mysql> create table test(id in ...
- sqoop将mysql的tinyint类型转化为boolean类型
当mysql中的字段为tinyint类型时,通过sqoop导入数据到hdfs上,在hdfs上显示的是true,false值.为了显示0,1. 解决方法: jdbc:mysql://<hostna ...
- eclipse 工程没有build path
项目的.project文件添加: <buildSpec><buildCommand><name>org.eclipse.jdt.core.javabuilder&l ...
- LeetCode——Unique Binary Search Trees II
Question Given an integer n, generate all structurally unique BST's (binary search trees) that store ...
- java将配置信息写在数据库(利用反射)
Demo出处: 1. package com.fpx.pcs.prealert.process.xml.service.impl; public class CainiaoPushMessageSer ...
- 数据库的ACID特性详解
ACID是指在 数据库管理系统(DBMS)中事物所具有的四个特性:原子性.一致性.隔离性.持久性 事物:在数据库系统中,一个事务是指由一系列连续的数据库操作组成的一个完整的逻辑过程.这组操作执行前后, ...
- Kettle 数据抽取
1.创建数据库连接 2.建立转换 3.指定源数据库和目标数据库的字段映射 一定要在「输出」中勾选「指定字段」,然后点按钮「Get All fields」,再「Enter mapping」,在弹出窗口映 ...