this引用逸出
2024-09-05 01:06:31
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;
}
}
线程的版本也可以这样写,只要保证构造函数构造完毕即可.
最新文章
- [BZOJ1106][POI2007] Tet 立方体大作战
- Xcode7--免证书真机调试
- [NOIP2010初赛]烽火传递+单调队列详细整理
- tc 146 2 BridgeCrossing(n人过桥问题)
- Go - 内置函数大全
- Sqli-LABS通关笔录-17-审计SQL注入
- .net学习笔记----有序集合SortedList、SortedList<;TKey,TValue>;、SortedDictionary<;TKey,TValue>;
- 一些JavaScript题目
- 关于js中this的疑问
- c# 简单的通用基础字典
- HDU-3436 Queue-jumpers 树状数组 | Splay tree删除,移动
- StretchDIBits使用方法
- 第三章:挖掘SimpleSection.o
- [译]Stairway to Integration Services Level 3 - 增量导入数据
- Java:网络编程
- goroutine 加 channel 代替递归调用,突破递归调用的层级限制
- mysql习题
- nodejs--(一)http模板篇
- jframe 对象(GroupedAction)传递无法调用对象的方法解决办法
- java课程之团队开发冲刺阶段1.5