当前位置: 首页 > news >正文

java this 逸出_this引用逸出

最近在看《Java 并发编程实践》看到3.2章里面的关于发布和逸出的部分,写一下心得,算是mark一下,主要是构造过程中this引用的逸出。

书上面给出了一个构造过程中this逸出的例子:

public classThisEscape {publicThisEscape(EventSource source) {

source.registerListener(newEventListener() {public voidonEvent(Event e) {

doSomething(e);

}

});

}voiddoSomething(Event e) {

}interfaceEventSource {voidregisterListener(EventListener e);

}interfaceEventListener {voidonEvent(Event e);

}interfaceEvent {

}

}

这将导致this逸出,所谓逸出,就是在不该发布的时候发布了一个引用。在这个例子里面,当我们实例化ThisEscape对象时,会调用source的registerListener方法,这时便启动了一个线程,而且这个线程持有了ThisEscape对象(调用了对象的doSomething方法),但此时ThisEscape对象却没有实例化完成(还没有返回一个引用),所以我们说,此时造成了一个this引用逸出,即还没有完成的实例化ThisEscape对象的动作,却已经暴露了对象的引用。其他线程访问还没有构造好的对象,可能会造成意料不到的问题。

最后,书里面给出了正确构造过程:

public classSafeListener {private finalEventListener listener;privateSafeListener() {

listener= newEventListener() {public voidonEvent(Event e) {

doSomething(e);

}

};

}public staticSafeListener newInstance(EventSource source) {

SafeListener safe= newSafeListener();

source.registerListener(safe.listener);returnsafe;

}voiddoSomething(Event e) {

}interfaceEventSource {voidregisterListener(EventListener e);

}interfaceEventListener {voidonEvent(Event e);

}interfaceEvent {

}

}

在这个构造中,我们看到的最大的一个区别就是:当构造好了SafeListener对象(通过构造器构造)之后,我们才启动了监听线程,也就确保了SafeListener对象是构造完成之后再使用的SafeListener对象。

对于这样的技术,书里面也有这样的注释:

具体来说,只有当构造函数返回时,this引用才应该从线程中逸出。构造函数可以将this引用保存到某个地方,只要其他线程不会在构造函数完成之前使用它。

相关文章:

  • java单机多核怎么实现的_JAVA实现对于多核CPU的OS满足CPU使用率在50%左右以及实现CPU使用率为正弦曲线-Go语言中文社区...
  • java序列化第二次出错_1.2.28反序列化类bug java.lang.VerifyError:
  • java对mysql读写权限设置_Mac 配置java版本 ---- MySql数据库权限设置 --- openfire
  • java中英对比_中英文代码对比系列之Java一例
  • java 算术字符串_java-从定义为字符串的运算符执行算术运算
  • c#项目 java项目_c#项目转Java项目!!!!!
  • mysql 创建xml字段_用MySQL和PHP创建XML
  • java实现 一维装箱问题_c语言来实现贪心算法之装箱问题
  • hmcl电脑java我的世界启动器_hello minecraft下载
  • 强制停止java_java – 如何强制停止Android应用程序
  • acacm icpc java_用Latex高效整理你的ACM-ICPC模板
  • java getmethods_java – 什么决定了Class.getMethods()的返回顺序?
  • java mapper xml 参数_Mybatis 文档篇 3.4:Mapper XML 之 Parameters
  • java类的加载是jvm,JVM学习(一):Java类的加载机制
  • PHP一点上传文件时下载文件啦,PHP中上传大体积文件时需要的设置
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • JavaScript函数式编程(一)
  • Mybatis初体验
  • React-flux杂记
  • Yeoman_Bower_Grunt
  • 程序员该如何有效的找工作?
  • 初识MongoDB分片
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 记一次和乔布斯合作最难忘的经历
  • 前端学习笔记之观察者模式
  • 如何选择开源的机器学习框架?
  • 小程序button引导用户授权
  • 小李飞刀:SQL题目刷起来!
  • ​2020 年大前端技术趋势解读
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #define、const、typedef的差别
  • #Linux(make工具和makefile文件以及makefile语法)
  • $.proxy和$.extend
  • (6)添加vue-cookie
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (转)Mysql的优化设置
  • (转)原始图像数据和PDF中的图像数据
  • (转载)Google Chrome调试JS
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • ./configure、make、make install 命令
  • .NET delegate 委托 、 Event 事件
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .net中生成excel后调整宽度
  • [ 渗透工具篇 ] 一篇文章让你掌握神奇的shuize -- 信息收集自动化工具
  • [20190401]关于semtimedop函数调用.txt
  • [bzoj1006]: [HNOI2008]神奇的国度(最大势算法)
  • [C# 基础知识系列]专题十六:Linq介绍
  • [C++进阶篇]STL中vector的使用
  • [Django 0-1] Core.Handlers 模块
  • [HDOJ4911]Inversion