这一章节我们来讨论一下对象的发布与逸出。

其实在前两个章节我们都有想应的讨论,只不过有一些不用补充的问题,我将会放到这个章节里面去。

1.发布(Publish)

当一个对象能够给其他代码引用。

package com.ray.deepintothread.ch04.topic_1;import java.util.HashMap;public class Publish {private HashMap<String, Object> map = null;public HashMap<String, Object> getMap() {return map;}public void setMap(HashMap<String, Object> map) {this.map = map;}public Publish() {map = new HashMap<String, Object>();}
}

例如上面的map,我们可以通过get方法得到他的引用,这个就叫发布。

如果map是public,我们可以直接通过对象来引用它,如果是public+static,直接可以通过类来引用。

注意:map的发布,代表map里面所有的对象以及发布,也就是说,我可以通过引用map来引用里面所有的对象。

package com.ray.deepintothread.ch04.topic_1;import java.util.HashMap;public class Publish2 {private HashMap<String, Object> map = null;public HashMap<String, Object> getMap() {return map;}public void setMap(HashMap<String, Object> map) {this.map = map;}public Publish2() {map = new HashMap<String, Object>();map.put("key", "value");}public void getItemOfMap() {HashMap<String, Object> map = getMap();Object object = map.get("key");}
}

我们在上面的代码里面增加一个方法,就可以得到相应的引用。

2.逸出(escape)

就是当一个不该发布的对象发不了,就变成了逸出

package com.ray.deepintothread.ch04.topic_1;public class Escape {private int id = 0;private String name = null;public Escape() {new Thread(new MyClass()).start();new Thread(new MyClass()).start();name = "ray";}private class MyClass implements Runnable {@Overridepublic void run() {System.out.println(Escape.this.name);System.out.println(Escape.this.id);}}public static void main(String[] args) {new Escape();}
}

输出:

null
0
ray
0

我们从输出可以看见,其实我们更想看到的结果是两个ray和0,但是其中一个输出跟我们的想象不符,就是因为对象的逸出和多线程的计算造成的。

在引用Escape.this这个对象的时候,其实Escape这个对象还没有构造完成

一般这种现象会出现在在构造函数里面启动线程。

3.逸出的解决方案

package com.ray.deepintothread.ch04.topic_1;public class SolutionOfEscape {private int id = 0;private String name = null;Thread thread1 = null;Thread thread2 = null;public SolutionOfEscape() {thread1 = new Thread(new MyClass());thread2 = new Thread(new MyClass());name = "ray";}public void start() {thread1.start();thread2.start();}private class MyClass implements Runnable {@Overridepublic void run() {System.out.println(SolutionOfEscape.this.name);System.out.println(SolutionOfEscape.this.id);}}public static void main(String[] args) {new SolutionOfEscape().start();}
}

输出:

ray
0
ray
0

我们只需要避免在构造函数里面启动线程。

其实我们上面的解决方案只是就上面的一个例子来说的,更深层次的解决方案是,在构造函数执行完之前,要避免使用Object.this这种引用

总结:这一章节我们讨论了对象的发布(Publish)、逸出(Escape)以及逸出的解决方案。

这一章节就到这里,谢谢

------------------------------------------------------------------------------------

我的github:https://github.com/raylee2015/DeepIntoThread

目录:http://blog.csdn.net/raylee2007/article/details/51204573

从头认识多线程-4.1 对象的发布(Publish)、逸出(Escape)以及逸出的解决方案相关推荐

  1. 多线程5:对象的发布与逸出(线程安全性)

    发布:使对象能够在当前作用域之外的代码中使用 逸出:当某个不该被发布的对象被发布时,这种情况称为逸出 发布内部状态将会破坏封装性,并使得程序难以维持不变性条件 当某个对象逸出后,必须对程序进行分析,以 ...

  2. Java对象的发布与逸出

    1. 概念 "发布(Publish)"一个对象:使对象能够在当前作用域之外的代码中使用. 例如:将一个指向该对象的引用保到其他代码可以访问的地方,或者在某个非私有的方法中返回该引用 ...

  3. 并发编程之对象的发布和逸出

    一.对象的发布和逸出 发布(publish)对象意味着其作用域之外的代码可以访问操作此对象.例如将对象的引用保存到其他代码可以访问的地方,或者在非私有的方法中返回对象的引用,或者将对象的引用传递给其他 ...

  4. Java 并发编程(二)对象的发布逸出和线程封闭

    对象的发布与逸出 "发布(Publish)"一个对象是指使对象能够在当前作用域之外的代码中使用.可以通过 公有静态变量,非私有方法,构造方法内隐含引用 三种方式. 如果对象构造完成 ...

  5. SQLServer 事务复制中使用脚本添加某个对象的发布

    SQLServer 事务复制中使用脚本添加某个对象的发布 原文:SQLServer 事务复制中使用脚本添加某个对象的发布 -- use [发布库] --添加表:创建项目并将其添加到发布中 exec s ...

  6. java火箭应用_从火箭发场景来学习Java多线程并发闭锁对象

    原标题:从火箭发场景来学习Java多线程并发闭锁对象 从火箭发场景来学习Java多线程并发闭锁对象 倒计时器场景 在我们开发过程中,有时候会使用到倒计时计数器.最简单的是:int size = 5; ...

  7. Win32多线程之被激发的对象(Signaled Objects)

    核心对象在"Win32多线程之核心对象"已经讲过,如文件,进程,互斥器(Mutexes)等.这些对象的状态都可能是线程关心的东西.信号量(semaphores)和互斥器(mutex ...

  8. java 闭锁_从火箭发场景来学习Java多线程并发闭锁对象

    从火箭发场景来学习Java多线程并发闭锁对象 倒计时器场景 在我们开发过程中,有时候会使用到倒计时计数器.最简单的是:int size = 5; 执行后,size-这种方式来实现.但是在多线程并发的情 ...

  9. Android多线程操作操作对象出现空指针问题

    在android中经常会有一些多线程操作同一对象的问题,经常会发生空指针的情况,尤其是跑monkey测试时. 下面写点伪代码举例说明一下: //已知mHandler为成员变量: if (mHandle ...

最新文章

  1. AIX系统管理--关于unsuccessful login attempts和account_locked
  2. 开源中国iOS客户端学习——(五)网络通信ASI类库(1)
  3. 区块链BaaS云服务(21)腾讯CCGP”跨链事务“
  4. php 规格,PHP 设计模式系列之 specification规格模式_PHP
  5. Windows中启动Redis走配置文件的bat脚本
  6. 深山红叶PE工具箱嫦娥一号纪念版 V30[1115]
  7. ltp-ddt qspi_mtd_dd_rw error can't read superblock on /dev/mtdblock0
  8. VBS编程基础教程 (第5篇)
  9. 使用cgroup限制某个程序对内存的使用
  10. UML序列图总结(转)
  11. Eclipse ADT 更换主题
  12. switch语句应用例题
  13. 前端如何设置浏览器网页标签页前的小图标favicon.ico
  14. 大数据和云计算是如何结合
  15. iOS 苹果内购详细步骤
  16. 密码学数论基础部分总结之 有限域GF(p) Galois Fields
  17. python用双重循环输出菱形图案_使用循环创建菱形图案
  18. openresty 支持php,从零搭建php环境-openresty
  19. 微软开源的浏览器自动化工具-Playwright
  20. (全网最详细最有深度)超过1W字深度剖析JVM常量池

热门文章

  1. xp系统t3登录不到服务器,用友T3软件服务器xp系统,客户端xp系统,登不上服务器...
  2. centos7中安装mysql步骤及命令教程
  3. 2021-10-20马丁策略真的能盈利?
  4. mysql查询特定时间数据视频_MySQL如何查询指定时间数据
  5. QT for symbian 开发环境安装
  6. java轮播添加图片_给网站首页添加图片轮播的效果
  7. 农行曹少雄:五创新拥抱互联网金融大潮
  8. 简约大气的WordPress社区论坛主题模板
  9. Selenium Chrome版本与chromedriver兼容版本对照表
  10. 【Selenium】不同chrome版本对应的chrome驱动版本