gpt4 book ai didi

java - list 3.7 在实践中如何在 java 并发中工作?

转载 作者:行者123 更新时间:2023-11-29 03:13:02 25 4
gpt4 key购买 nike

list 3.7。隐式允许 this 引用转义。不要这样做。

public class ThisEscape {
public ThisEscape(EventSource source) {
source.registerListener(
new EventListener() {
public void onEvent(Event e) {
doSomething(e);
}
}
}
}
}

引用“可以发布对象或其内部状态的最终机制是发布内部类实例,如 list 3.7 中的 ThisEscape 所示。当 ThisEscape 发布 EventListener 时,它也隐式发布封闭的 ThisEscape 实例,因为内部类实例包含一个对封闭实例的隐藏引用。 "

我的问题是:这个隐藏的引用在哪里?如何利用它?

最佳答案

“隐藏引用”是任何非静态内部类都具有的隐式变量,允许它引用其外部类的成员。

考虑该类的一个稍作修改的版本:

public class ThisEscape {
private final List<EventSource> listOfEvents;
public ThisEscape(EventSource source) {
source.registerListener(
new EventListener() {
public void onEvent(Event e) {
doSomething(e);
listOfEvents.add(e); //The "hidden reference" is what allows this inner class
//to use the parent's "listOfEvents" member variable
}
}
}
Thread.sleep(5000); //This would need a try/catch - skipping that
listOfEvents = new ArrayList<EventSource>();
}
}

在这种情况下,问题所在很明显 - 如果在 Thread.sleep 完成之前将任何事件传递给 EventListenerlistOfEvents 仍为 null,您将得到一个 NullPointerException

由于 Java 处理跨线程内存可见性的方式,即使您删除了对 sleep 的调用,您仍然可以产生类似的效果(尽管这种可能性要小得多),即使您在调用 registerListener 之前移动了 listOfEvents 的初始化!

就“利用”这一点而言,这在很大程度上取决于上下文 - 但上述模式的任何实例肯定是一个可能发生的潜在错误,即使没有攻击者试图利用它也是如此。

关于java - list 3.7 在实践中如何在 java 并发中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28237509/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com