Java并发编程实践-this溢出
《Java并发编程实践》一书中,提到“在构造函数中调用一个可覆盖的(那些既不是private,也不是final的)实例方法同样会导致this引用在构造期间溢出。”,这句话读来简单,但是却干货满满,这里举一个简单的示例来进行说明。
ThisEscape类:
public class ThisEscape { public ThisEscape() {System.out.println("ThisEscape ");// 在构造方法中其调用了非final和private的方法Say();}public void Say() {System.out.println("ThisEscape .Say()");}public static void main(String[] args) {new ThisEscapeSon();new ThisEscapeSon("Hello World");}
}
ThisEscapeSon.class类
ThisEscapeSon继承自ThisEscape类并且重写了Say方法。
class ThisEscapeSon extends ThisEscape {private final String name;public ThisEscapeSon() {this.name = "Hello Word";System.out.println("ThisEscapeSon");}public ThisEscapeSon(String name) {this.name = name;System.out.println("ThisEscapeSon");}/** 在子类中重写Say方法*/@Overridepublic void Say() {System.out.println("ThisEscapeSon.Say()-->" + name);}
}
执行结果
ThisEscape
ThisEscapeSon.Say()-->null
ThisEscapeSon
ThisEscape
ThisEscapeSon.Say()-->null
ThisEscapeSon
分析:无论是调用子类(ThisEscapeSon)的默认构造函数还是带参构造器来实例化ThisEscapeSon实例,默认情况下它都会首先依次调用父类的无参构造方法(相当于构造函数第一行代码处调用父类的无参构造器)实例化父类,接着才会执行子类构造器的其他方法。
所以,当执行到父类ThisEscape构造器中执行Say()方法时,此时由于子类已经重写了Say()方法,他就会调用子类的Say()方法,实际上,在这里就可以预见this溢出的后果了,由于子类中的this.name
语句还没有执行,所以,执行Say()方法时name
成员变量并没有被赋值,所以会打印null
值。
总结:父类构造方法调用的非final、private方法,如果存在子类的情况下,对于该方法的执行就会具有不可预见性的问题,这在编程过程需要极度注意的。
修改方式:
1)将ThisEscape
的Say()
方法改成private
作用域,那么,子类ThisEscapeSon
就不能重写该方法,而只是重新定义了Say()
方法,此时,只会调用ThisEscape
的Say()
方法完成相应的功能。
2)将ThisEscape
的Say()
方法改成final
作用域,那么,如果子类定义Say()
,就会报编译器错误,从而防止类似不可以预见性事件的发生。
Java并发编程实践-this溢出相关推荐
- [Java 并发] Java并发编程实践 思维导图 - 第一章 简单介绍
阅读<Java并发编程实践>一书后整理的思维导图.
- 《Java并发编程实践》学习笔记之一:基础知识
<Java并发编程实践>学习笔记之一:基础知识 1.程序与进程 1.1 程序与进程的概念 (1)程序:一组有序的静态指令,是一种静态概念: (2)进程:是一种活动,它是由一个动作序列组成 ...
- Java并发编程实战_一线大厂架构师整理:java并发编程实践教程
并发编程是Java语言的重要特性之一, 在Java平台上提供了许多基本的并发功能来辅助开发多线程应用程序.然而,这些相对底层的并发功能与上层应用程序的并发语义之间并不存在一种简单而直观的映射关系.因此 ...
- java并发编程实践_Java并发编程实践如何正确使用Unsafe
一.前言 Java 并发编程实践中的话: 编写正确的程序并不容易,而编写正常的并发程序就更难了.相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各 ...
- java并发编程实践(2)线程安全性
[0]README 0.0)本文部分文字描述转自:"java并发编程实战", 旨在学习"java并发编程实践(2)线程安全性" 的相关知识: 0.1)几个术语( ...
- java并发编程实践(1)intro
[0]README 0.1)本文部分文字描述转自"java并发编程实践",旨在学习"java并发编程实践(1)intro"的相关知识: [3]线程带来的风险 [ ...
- JAVA并发编程实践笔记
2019独角兽企业重金招聘Python工程师标准>>> JAVA并发编程实践笔记 博客分类: java JAVA并发编程实践笔记 1, 保证线程安全的三种方法: a, 不要跨 ...
- java并发编程实践-带完整书签pdf电子扫描版
2007年6月由电子工业出版社出版发行,是一本经典的Java并发参考手册.java并发编程实践随着多核处理器的普及,使用并发成为构建高性能应用程序的关键.Java5以及6在开发并发程序中取得了显著的进 ...
- 《Java并发编程实践-第一部分》-读书笔记
大家好,我是烤鸭: <Java并发编程实战-第一部分>-读书笔记. 第一章:介绍 1.1 并发历史: 多个程序在各自的进程中执行,由系统分配资源,如:内存.文件句柄.安全证书.进程间通信方 ...
- java并发编程实践 读书笔记_Java - 并发编程实践(读书笔记)
[注] 同步机制保证:1)原子性 2)内存可见性: Volatile变量只能保证:1)可见性: - 恰当的同步,同步的弱形式,确保对一个变量的更新以可预见的方式告知其他线程. [注] 用锁来协调访问变 ...
最新文章
- 生态伙伴 | Canva上线飞书应用目录,帮你零门槛轻松做出大师级设计!
- 开源流媒体项目 live555 简介
- MIME type类型
- aws 堆栈模板_使用Arquillian和LocalStack脱机测试AWS云堆栈
- mysql 索引效果是否叠加_MySQL基础实用知识集合(二)
- leetcode No.83 删除排序链表中的重复元素
- CentOS安装运行NodeJS框架Express
- #JS 窗口resize避免触发多次
- Operating System-Thread(3)用户空间和内核空间实现线程
- 控制理论个人学习笔记-非线性系统理论
- 今日头条笔试 机器人跳跃问题
- 还在为日语动词变形感到困惑吗?一张图即可搞定
- 物联网模块选择注意事项
- vue渲染大量数据优化_vue大数据表格卡顿问题的完美解决方案
- Bi-Direction attention flow for machine reading(原理篇)
- 【Pandas】返回 视图 还是 副本?SettingwithCopyWarning 的原理和解决方案(摘录转载)
- 荣耀v30鸿蒙系统怎么升级,荣耀v30pro怎么升级鸿蒙系统
- 用友试水NC租用服务
- 1024程序节|你知道老师上课随机点名是怎么实现的吗
- Gerber 各层的含义