1.定义

public class UnsafeClass {

    public UnsafeClass(Button button) {
button.addActionListener(new ActionListener() {
//在这里发布 会导致this引用逸出,因为构造函数没有完全返回
//如果在这里新建新的线程,那么新线程会持有没有完全构造完成的this引用
@Override
public void actionPerformed(ActionEvent e) { }
});
}
}

如上述代码所示,在构造函数中定义新的线程或者发布会导致this引用逸出,此时的问题就在于构造函数还没有构造完成.

2.解决

public class SafeClass {
private final ActionListener actionListener;
private SafeClass() {
actionListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
}
};
}
public SafeClass newInstance(Button button) {
//构造函数构造完毕在进行发布
SafeClass safeClass = new SafeClass();
button.addActionListener(safeClass.actionListener);
return safeClass;
}
}

发布this没有问题,只要在构造函数返回时进行发布就可以了.

public class SafeClass {
private final Runnable runnable;
private SafeClass() {
runnable = new Runnable() { @Override
public void run() {
}
}; }
public SafeClass newInstance(Thread d) {
//构造函数构造完毕在进行发布
SafeClass safeClass = new SafeClass();
d = new Thread(safeClass.runnable);
return safeClass;
}
}

线程的版本也可以这样写,只要保证构造函数构造完毕即可.

最新文章

  1. [BZOJ1106][POI2007] Tet 立方体大作战
  2. Xcode7--免证书真机调试
  3. [NOIP2010初赛]烽火传递+单调队列详细整理
  4. tc 146 2 BridgeCrossing(n人过桥问题)
  5. Go - 内置函数大全
  6. Sqli-LABS通关笔录-17-审计SQL注入
  7. .net学习笔记----有序集合SortedList、SortedList<TKey,TValue>、SortedDictionary<TKey,TValue>
  8. 一些JavaScript题目
  9. 关于js中this的疑问
  10. c# 简单的通用基础字典
  11. HDU-3436 Queue-jumpers 树状数组 | Splay tree删除,移动
  12. StretchDIBits使用方法
  13. 第三章:挖掘SimpleSection.o
  14. [译]Stairway to Integration Services Level 3 - 增量导入数据
  15. Java:网络编程
  16. goroutine 加 channel 代替递归调用,突破递归调用的层级限制
  17. mysql习题
  18. nodejs--(一)http模板篇
  19. jframe 对象(GroupedAction)传递无法调用对象的方法解决办法
  20. java课程之团队开发冲刺阶段1.5

热门文章

  1. 【bzoj2523】【CTSC2001】聪明的学生
  2. BZOJ1912 最长链树形DP
  3. 检测字符串是否为UTF8编码
  4. C++使用socket传输图片
  5. 【洛谷P3957】跳房子
  6. JavaScript基础——JavaScript数据类型(笔记)
  7. oracle-linux7 镜像地址 secuCRT 注册-linux内核
  8. HGOI 20190821 慈溪一中互测
  9. FJOI2017前做题记录
  10. JAVA静态方法是否可以被继承