java并发编程实战的解释,不够详细,尤其this引用逸出让人理解有些费解,java并发编程实战里面的内容就直接拷贝过来

发布:使对象能够在当前作用域之外的代码中使用

逸出:当某个不该被发布的对象被发布时,这种情况称为逸出

发布内部状态将会破坏封装性,并使得程序难以维持不变性条件

当某个对象逸出后,必须对程序进行分析,以便找出哪些对象或线程可能会误用该对象,这正是使用封装的最主要原因:使对程序的正确性分析变为可能,并使无意中破坏设计约束条件变得更难

无论其它的线程会对逸出的对象引用执行何种操作,都不重要,因为误用该引用的风险始终是客观存在的

发布的实现方式

1.对象引用作为非私有属性

代码示例:

//只是代码示例,不推荐这样初始化List

public class test {

public List animals = new ArrayList(){{

add(new Animal());

}};

}

List对象和List中的Animal对象都被发布出去。

2.对象引用被非私有方法返回

代码示例:

//只是代码示例,不推荐这样初始化List

public class test {

private List animals = new ArrayList(){{

add(new Animal());

}};

public List getAnimals(){

return animals;

}

}

1、2的一样,List对象和List中的Animal对象发布出去。只是一个是方法发布出去,一个是属性发布出去。

3.外部方法发布对象

外部方法定义:

对当前类来说,外部方法是指行为不完全由当前类来规定的方法,包括其他类中定义的方法以及当前类中可以被改写的方法(既不是私有方法,也不是final方法)

代码示例:

public class test {

public void setAnimals(Animal animal){

animal.setDag(

new Dog(){

public void doSomething(){

...

};

}

)

}

}

当前类test来说,setDag为外部方法,Dog就被发布了。

this引用逸出

基于外部方法发布对象引出this引用逸出问题。直接拿java并发编程实战的代码

public class ThisEscape {

public ThisEscape(EventSource source){

source.registerListener(

new EventListener(){

public void onEvent(Event e){

doSomething(e)

}

});

}

}

java并发编程实战的解释:

当ThisEscape发布EventListener时,它也无条件地发布了封装(enclosing)ThisEscape的实例,因为内引类(inner class inst ances)的实例包含了对封装实例隐含的引用。

这里发布new EventListener()内部对象,隐式的有个this。也就是ThisEscape也会被发布出去,但是ThisEscape还没有构建完成,存在逸出的可能,ThisEscape在未构建完成被发布了。怎么处理这个可能逸出的问题,就是让ThisEscape构建完成再发布出去就可以了。java并发编程实战的提到私有构造函数+公共的工厂方法解决可能逸出的问题。

public class ThisEscape {

private final EventListener listener;

private ThisEscape(){

listener = new EventListener(){

public void onEvent(Event e){

doSomething(e)

}

};

}

public static ThisEscape newInstance(EventSource source){

ThisEscape thisEscape = new ThisEscape();

source.registerListener(thisEscape.listener);

return thisEscape;

}

}

同理在构造函数可以新建线程,当不要start()。start()的话this被新线程共享。下面代码就是错误的:

public class ThisEscape {

private Thread thread;

public ThisEscape(){

thread = new Thread(){

public void run(){

...

}

};

thread.start(); //可以在构造函数中new Thread 但是不要start

}

public static void main(String[] args){

ThisEscape a = new ThisEscape();

}

}

逸出 java_【java】知识系谱-基础篇-线程-发布、逸出相关推荐

  1. Java知识积累-基础篇

    把前段时间看过的内容,结合面试经历,作以整理,持续改进:D Java基础 JVM emmmm,为什么把JVM放第一个咧-- 主要是因为之前某次面试的时候被问到"从宏观角度怎么看Java&qu ...

  2. Java面试题基础篇(一)

    Java面试题基础篇(一) Java面试题基础篇(一) 1.jre和jdk有什么区别? 2.==与equals的区别? 3.接口和抽象类的共同点和不同点? 4.lamda表达式的优缺点? 5.Stri ...

  3. 《Java工程师成神之路》深入理解Java核心技术(基础篇)

    学习目标: 深入理解Java核心技术(基础篇) 学习内容: 1.面向对象的五大基本原则 (1)单一职责原则:一个类应该有且只有一个去改变它的理由,这意味着一个类应该只有一项工作. (2)开放封闭原则: ...

  4. 一起学JAVA之【基础篇】4种默认线程池介绍

    一起学JAVA之[基础篇]4种默认线程池介绍 默认线程池创建方式 java.util.concurrent 提供了一个创建线程池的工具类Executors,里面有四种常用的线程池创建方法 public ...

  5. Java修炼 之 基础篇(二)Java语言构成

    上次的博文中Java修炼 之 基础篇(一)Java语言特性我们介绍了一下Java语言的几个特性,今天我们介绍一下Java语言的构成. 所谓的Java构成,主要是指Java运行环境的组成,从外围到核心依 ...

  6. (原创) 脚踏实地学Java之:基础篇

    (原创)  脚踏实地学Java之:基础篇  最近与几个朋友闲聊技术,当谈起他们各自用JAVA做项目时所用到的技术时,夸夸其谈,不知所云,犹如布什总统竞选前的演讲一般精彩,听的我是云里雾里,一头雾水!但 ...

  7. Java语言程序设计 基础篇 原书第10版 ,梁勇著,百度云链接及密码

    一本好书,对java小白来说是一本非常不错的书.第一次分享,请大家多多指教, Java语言程序设计 基础篇 原书第10版 ,梁勇著 链接:https://pan.baidu.com/s/1-MN_AS ...

  8. 知识图谱 | 基础篇

    知识图谱 | 基础篇 1 什么是知识图谱? 1.1 图形角度 1.2 数据角度 1.3 技术角度 2 知识图谱和机器学习的关系? 2.1 部分应用殊途同归 2.2 部分应用相结合 2.3 过程中可以互 ...

  9. 【Java练习题汇总】《第一行代码JAVA》面向对象基础篇,汇总Java练习题——面向对象:特性、类与对象、数组、String、内部类... ~

    Java练习题 · 面向对象基础篇 1️⃣ 面向对象基础篇 1️⃣ 面向对象基础篇 一.填空题 面向对象的三大特征:_______ ._______ ._______. 类由_______和_____ ...

最新文章

  1. pbl和sbl_综合运用PBL和SBL教学法提高眼科带教质量的探索
  2. Python编程基础08:循环结构
  3. 跨行成为程序员的 15 个实用技巧!
  4. 文件操作03 - 零基础入门学习C语言62
  5. linux电容触摸屏驱动参数,linux 电容触摸屏驱动-1
  6. Error:(292, 40) java: -source 1.5 中不支持 diamond 运算符 (请使用 -source 7 或更高版本以启用 diamond 运算符) ........
  7. TFS映射关系出错的几种
  8. BUUCTF-Crypto-Quoted-printable题解
  9. java扫码枪键盘_浅谈在react中如何实现扫码枪输入
  10. js 时间转东八区_js:固定与东八区服务器时间保持一致并且可选时间格式
  11. 怎么把电脑上的python软件卸载干净_如何将电脑上的各种软件彻底卸载干净呢?...
  12. 基础算法--背包问题(01背包问题、完全背包问题、多重背包问题、分组背包问题)
  13. Git add 、commit后报错:nothing to commit, working tree clean
  14. 浅析项目工作量估算方法
  15. Java中的main( )函数
  16. 华为云计算基础之Fusion Compute介绍
  17. 【Python】基于Python获取链家小区房价信息及其POI数据
  18. ctrl +z / pause键 出现 [1]+ Stopped 怎么解决
  19. Jupyter Notebook 更改默认目录
  20. 【软件测试常见Bug清单】

热门文章

  1. 完整的Web应用程序Tomcat JSF Primefaces JPA Hibernate –第2部分
  2. 线程故事:Web应用程序中的ThreadLocal
  3. Java EE 6示例– Galleria第2部分
  4. 使用 ssh 命令来访问(登录/连接)远程服务器主机
  5. Spring Cloud Feign 熔断器支持
  6. @cacheable 是否缓存成功_缓存策略:如何使用缓存来减少磁盘IO?
  7. php的变量都放在哪里,php变量一般放在哪个位置
  8. 模块pdf2image.dll加载失败_Webpack 原理从前端模块化开始
  9. tampermonkey怎么不能用了_普洱茶发霉了怎么办?能不能用太阳晒
  10. python数码时钟代码_Python+Pyqt实现简单GUI电子时钟