发布逸出 java this 逸出【转】
转自: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 逸出【转】的更多相关文章
- Java 14 祭出代码简化大器,Lombok 要被干掉了?
Java 14 3 月发布距现在已经发布 2 个多月,发布了很多新特性,详细的新特性介绍可以看这篇文章: http://www.javastack.cn/article/2020/java14-has ...
- Atitti 跨语言异常的转换抛出 java js
Atitti 跨语言异常的转换抛出 java js 异常的转换,直接反序列化为json对象e对象即可.. Js.没有完整的e机制,可以参考java的实现一个stack层次机制的e对象即可.. 抛出Ru ...
- Java简单算法--出圈问题
package cn.magicdu.algorithm; import java.util.LinkedList; import java.util.List; /** * 出圈问题,数到某个数字的 ...
- 找出Java进程中大量消耗CPU
原文:https://github.com/oldratlee/useful-shells useful-shells 把平时有用的手动操作做成脚本,这样可以便捷的使用. show-busy-java ...
- java 检查抛出的异常是否是要捕获的检查性异常或运行时异常或错误
/** * Return whether the given throwable is a checked exception: * that is, neither a RuntimeExcepti ...
- AES加密时抛出java.security.InvalidKeyException: Illegal key size or def
原文:AES加密时抛出java.security.InvalidKeyException: Illegal key size or def 使用AES加密时,当密钥大于128时,代码会抛出 java. ...
- Java中过滤出字母、数字和中文的正则表达式
1.Java中过滤出字母.数字和中文的正则表达式 (1)过滤出字母的正则表达式 [^(A-Za-z)] (2)过滤出数字的正则表达式 [^(0-9)] (3)过滤出中文的正则表达式 [^(\\u4e0 ...
- PTA中如何出Java题目?
PTA中如何出Java题目? 很多第一次出题的老师,不知道Java在PTA中是如何处理输入的.写一篇文章供大家参考.比如以下这样的一个题目: 从控制台读入两个数,然后将其相加输出. 对于该题可以有如下 ...
- 一个简易的kmp教学并给出java实现
简单介绍一下问题 给定source字符串,找出target字符串出现的首位 例如 source 为“abddabddabc” target 为 “abddabc” 从第一位开始比较 |a b d ...
随机推荐
- 使用text-align:justify,让内容两端对齐,兼容IE及主流浏览器的方法
如果不喜欢看分析过程,可以跳到最后看最终兼容方案 史前方法: 以前实现两端对齐是这样的: <p class="box1">密 码</p> <p cl ...
- 递归思维判断数组a[N]是否为一个递增数组
递归的方法:记录当前最大的,并且判断当前的是否比这个还大,大则继续,否则返回false结束: bool fun( int a[], int n ) { ) { return true; } ) { ] ...
- websocket实现简单的通信
websocket server端 #coding=utf8 #!/usr/bin/python import struct,socket import hashlib import threadin ...
- Elastic Stack之搜索引擎基础
Elastic Stack之搜索引擎基础 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.搜索引擎概述 1>.什么是搜索引擎 搜索引擎(Search Engine)是指根 ...
- mysql清理binlog日志
mysql的binlog日志过多过大,清理过程. 1.查看binlog日志 mysql> show binary logs; +------------------+-----------+ | ...
- 虚拟机部署hadoop集群准备工作之多虚拟机设置网络信息
安装好了centos6.4(最简版)后 1,静态IP设置 查看虚拟机的网络设置信息来配置
- 网络编程基础【day09】:socketserver使用(九)
本节内容 1.概述 2.socketserver类型 3.创建socketserver步骤 4.简单的代码实现 一.概述 我们之前的用户都是不支持多并发的,所以我们现在需要一个支持多用户,实现一个并发 ...
- sc (service control )
SC 是用来与服务控制管理器和服务进行通信 net: net start 服务名 net stop 服务名 sc: sc config 服务名 start= demand //手动 sc con ...
- 在js或jquery中动态添加js脚本【转】
起因: 我们在用js动态写入script时,会导致</script>后面的所有语句都变为普通文本,导致html展示无效, 所以我们需要规避</script>问题. 解决方案一( ...
- Tornado基本应用
Tornado简介 Tornado有自己的socket(异步非阻塞,原生支持WebSocket),Django没有. Tornado的模板语言更接近Python风格,比Django要好理解. Demo ...