this引用逸出:某個對象在初始化的時候發佈自己這個對象。即,當前對象在初始化完成之前,給其它線程提供了引用。若其它線程先跑,則可能報錯。
下面是《java併發編程實踐》給出的實例:
public class ThisEscape {
public ThisEscape(EventSource source){
source.registerListner(new EventListner() {
public void onEvent(Event e){
doSomething(e);
}
});
}
void doSomething(Event e) {
}
interface EventSource {
void registerListner(EventListner e);
}
interface EventListner {
void onEvent(Event e);
}
interface Event {
}
}
書中給的更改:
public class ThisNotEscape {
private final EventListner listner;
public ThisNotEscape() {
listner = new EventListner() {
public void onEvent(Event e) {
doSomething(e);
}
};
}
public static ThisNotEscape newInstance(EventSource source){
ThisNotEscape thisNotEscape=new ThisNotEscape();
source.registerListner(thisNotEscape.listner);
return thisNotEscape;
}
void doSomething(Event e) {
}
interface EventSource {
void registerListner(EventListner e);
}
interface EventListner {
void onEvent(Event e);
}
interface Event {
}
}
總結:簡單的來說,對象的使用應在其實例化之後。
轉載於:https://blog.csdn.net/more_try/article/details/86742767
如有問題,請留言,感激不盡。