转自:http://blog.csdn.net/joker_zhou/article/details/7322801

(1)发布:发布是指将一个对象,使其引用储存到一个其他代码可以访问到的地方,在一个非私有方法返回这个引用,也可以把它传递到其他对象中.

a)  发布最简单的就是将对象设置到公共静态域中

b)  发布第二种简单的方式就是在一个公共方法内直接return 对象的引用

第三种的发布就很隐秘了.就是讲自身的对象引用发布到另一个对象的引用中.
可能在构造中出现如此这就是this例如:

这样 source就持有ThisEscape的内部类EvenListener()而Evenlistener可能会带出ThisEscape中的保护数据引用,可以使用工厂和私有构造防止发布逸出,这样ThisEscape对象就可以构造完成然后使用ThisEscape.registerListener(source)放入监听器.最好不要在构造内注册监听器或者启动线程.而在工厂内初始化这些事情.

class A1{
public EventListener l;
} public class MyThread{
EventListener l=null;
private MyThread(){
l=new EventListener() {
};
}
public static MyThread newInstance(A1 a){
MyThread my=new MyThread();
<span style="white-space:pre"> </span> a.l=my.l;
return my;
}
}

其实A1中的l我没有封装.应该加以封装.我只是掩饰下如何注册

(2)逸出:如果对象在没有构造完成前就将其发布,这就是逸出.在构造中启动线程,会使未构造完成的对象发布出去,造成逸出.

(3)如何安全的发布:

a)  通常发布线程与消费线程需要同步化.

b)  通过静态初始化初始对象的引用.

c)  引用储存到volatile或者AtomicReference

d)  引用储存到正确创建对象的final域中

(4)如果需要发布一个非线程安全的状态集(就是包含基本类型的对象),可以先复制对象,然后发布复制后的对象.这样避免外来客户修改非线程安全的类.造成同步错误.这前提是不需要此集合状态在多个线程间一致.

(5)发布一个线程安全的类,并不需要复制-发布.

(6)可以安全的发布一个线程安全的类并且发布时不需要有任何我约束行为

发布逸出 java this 逸出【转】的更多相关文章

  1. Java 14 祭出代码简化大器,Lombok 要被干掉了?

    Java 14 3 月发布距现在已经发布 2 个多月,发布了很多新特性,详细的新特性介绍可以看这篇文章: http://www.javastack.cn/article/2020/java14-has ...

  2. Atitti 跨语言异常的转换抛出 java js

    Atitti 跨语言异常的转换抛出 java js 异常的转换,直接反序列化为json对象e对象即可.. Js.没有完整的e机制,可以参考java的实现一个stack层次机制的e对象即可.. 抛出Ru ...

  3. Java简单算法--出圈问题

    package cn.magicdu.algorithm; import java.util.LinkedList; import java.util.List; /** * 出圈问题,数到某个数字的 ...

  4. 找出Java进程中大量消耗CPU

    原文:https://github.com/oldratlee/useful-shells useful-shells 把平时有用的手动操作做成脚本,这样可以便捷的使用. show-busy-java ...

  5. java 检查抛出的异常是否是要捕获的检查性异常或运行时异常或错误

    /** * Return whether the given throwable is a checked exception: * that is, neither a RuntimeExcepti ...

  6. AES加密时抛出java.security.InvalidKeyException: Illegal key size or def

    原文:AES加密时抛出java.security.InvalidKeyException: Illegal key size or def 使用AES加密时,当密钥大于128时,代码会抛出 java. ...

  7. Java中过滤出字母、数字和中文的正则表达式

    1.Java中过滤出字母.数字和中文的正则表达式 (1)过滤出字母的正则表达式 [^(A-Za-z)] (2)过滤出数字的正则表达式 [^(0-9)] (3)过滤出中文的正则表达式 [^(\\u4e0 ...

  8. PTA中如何出Java题目?

    PTA中如何出Java题目? 很多第一次出题的老师,不知道Java在PTA中是如何处理输入的.写一篇文章供大家参考.比如以下这样的一个题目: 从控制台读入两个数,然后将其相加输出. 对于该题可以有如下 ...

  9. 一个简易的kmp教学并给出java实现

    简单介绍一下问题 给定source字符串,找出target字符串出现的首位 例如 source   为“abddabddabc” target 为 “abddabc” 从第一位开始比较 |a b d ...

随机推荐

  1. 数据库日志redo和undo

    数据库的ACID属性 Atomicity:原子性,以事物transact为最小单位,事物中的所有操作,要么都执行完,要么都不执行,不存在一部分操作执行,另一部分操作不执行的情况. Consistenc ...

  2. delphi中Bitmap位图与base64字符串相互转换

    uses EncdDecd; ///将Bitmap位图转化为base64字符串 function BitmapToString(img:TBitmap):string ; var ms:TMemory ...

  3. qml: 软件启用前插入广告;

    一般来说,免费软件或者部分商业软件在发布前都会放一些广告在软件上. 下面是我自己的方案(哪位有更好的方案,请告知,先谢): ...... ApplicationWindow{ visible: !ad ...

  4. 【Mac进销存管理软件】Daily Sales Pro Mac

        [简介] Daily Sales Mac版是Mac平台上的一款进销存软件,库存管理系统.Daily Sales Mac版是一款易于使用的进出库存管理软件,让您及时了解库存状况.销售收入.采购成 ...

  5. python机器学习-sklearn挖掘乳腺癌细胞(五)

    python机器学习-sklearn挖掘乳腺癌细胞( 博主亲自录制) 网易云观看地址 https://study.163.com/course/introduction.htm?courseId=10 ...

  6. hadoop 开发环境搭建

    一,安装java环境 添加java环境变量 vi /etc/profile   # add by tank export JAVA_HOME=/data/soft/jdk/jdk1.7.0_71 ex ...

  7. CSS3 vmax的用法

    1. calc() calc():在流体布局上,可以通过calc()计算得到元素的宽度. 2. vw/vh/vmin/vmax的使用 vw/vh/vmin/vmax是视窗单位,也是相对单位.相对的不是 ...

  8. mysql导入导出sql文件,source导入速度慢的解决办法

    1.导出整个数据库mysqldump -u 用户名 -p 数据库名 > 导出的文件名mysqldump -u dbuser -p dbname > dbname.sql2.导出一个表mys ...

  9. Mongoose笔记

    Mongoose是在node.js异步环境下对mongodb进行便捷操作的对象模型工具 mongoose是针对mongoDB操作的一个对象模型库,封装了mongoDB对文档的.增删改查等方法 使用Ko ...

  10. Spring MVC整合Mybatis 入门

    本文记录使用Intellij创建Maven Web工程搭建Spring MVC + Mybatis 的一个非常简单的示例.关于Mybatis的入门使用可参考这篇文章,本文在该文的基础上,引入了Spri ...