this引用逸出
来源:互联网 发布:mac磁盘可清除怎么清除 编辑:程序博客网 时间:2024/05/02 00:57
《Java 并发编程实践》3.2章里面的关于发布和逸出的部分,主要是构造过程中this引用的逸出。
public class ThisEscape { public ThisEscape(EventSource source){ source.registerListener( new EventListener(){ public void onEvent(Event e){ doSomething()e; } }); }}
这段代码的问题是对象逸出。
当我们声明一个非静态内部类时,编译器会添加对外部类的一个隐式引用。即非静态的内部类会持有外部类的一个隐式引用。
当我们实例化ThisEscape对象时,会调用source的registerListener方法,这时便启动了一个线程,而且这个线程持有了通过注册的内部类持有了外部ThisEscape对象引用,但此时ThisEscape对象却没有实例化完成(还没有返回一个引用),所以我们说,此时造成了一个this引用逸出,即还没有完成的实例化ThisEscape对象的动作,却已经暴露了对象的引用。其他线程访问还没有构造好的对象,可能会造成意料不到的问题。
书中给了解决方法,使用工厂方法防止this引用在构造过程中逸出。
public class SafeListener { private final EventListener listener; private SafeListener(){ listener = new EventListener(){ public void onEvent(Event e){ doSomething(e); } } } public static SafeListener newInstance(EventSource source){ SafeListener safe = new SafeListener(); source.registerListener(safe.listener); return safe; }}
不在构造方法中注册监听器,就不会创建持有外部引用的线程,this引用也就不会逸出。
阅读全文
0 0
- This引用逸出
- this 引用逸出
- this引用逸出
- Java并发编程实战--this引用逸出
- 并发编程实战笔记-this引用逸出
- Java并发编程——this引用逸出("this" Escape)
- Java并发编程——this引用逸出("this" Escape)
- Java并发编程——this引用逸出("this" Escape)
- This逸出
- this引用
- this引用
- this引用
- 对象的this引用
- 3.4 this 引用句柄
- Java "This" reference(引用)
- 关于this引用
- this对象的引用
- Java this 引用逃逸
- 在VS2013和GCC中都使用中文
- sql的经典我是道题
- 蓝桥杯:分解质因数
- Pip
- 十一、C++数组
- this引用逸出
- 服务器路径获取方式
- Java多线程之volatile作用阐述
- java第一阶段知识点
- PyMySQL
- Java JDBC连接SQL Server数据库初级
- 获取路由参数
- 文件的复制
- //Leedcode-Valid Parentheses