java - Object Publication 和 Escape Java concurrency ,这个引用是如何在这里转义的?
问题描述
最近在看《Java Concurrency in practice》,遇到了 Publication 和 Escape 的例子,看了好几遍还是觉得没有完全看懂这个例子。
public class ThisEscape{
public ThisEscape(EventSource source){
source.registerListener(
new EventListener(){
public void onEvent(Event e){
doSomething(e);
}
}
)
}
}
ThisEscape 说明了 Escape 的一个重要特殊情况 - 当this引用在构造过程中转义时。当内部的 EvenListener 实例被发布时,封闭的 ThisEsape 实例也是如此。但是对象只有在其构造函数返回后才处于可预测的一致状态。因此,从其构造函数中发布一个对象可能会发布一个构造不完整的对象。即使发布是构造函数中的最后一条语句也是如此。如果 this 引用在构造过程中转义,则认为该对象构造不正确。
ThisEscape
cosntructor 正在向 EventListener 注册一个 EventSource,我们在其中指定一个传递 Event 实例的 onEvent 行为。但是在这里我假设对象构造的顺序是EventListener --> ThisEscape
这样的this引用如何ThisEscape
被传递到这里来逃避?
解决方案
我认为我们应该参考这段摘录:
当内部的 EvenListener 实例被发布时,封闭的 ThisEsape 实例也是如此。
这让我觉得doSomething()
它是一个方法ThisEscape
(否则引用不会逃逸),意思ThisEscape
是一个监听器EventSource
,它在构造过程中通过覆盖EventListener
的onEvent
方法注册自己。
简单来说就是:“当有新事件发生时,调用doSomething()
”。
在这一点上,问题很简单。想象一下,我们在ThisEscape
's 的构造函数中注册了一个新的监听器......并且立即......一个事件发生了!当一个线程仍在构建ThisEscape
时,另一个线程已经在调用doSomething()
,这可能会导致非常不可预测的结果......
推荐阅读
- cassandra - Cassandra node running, but cant connect?
- java - 为需要文件位置的方法编写单元测试
- c# - 从列表中取出 x 个项目,其中每个项目对某个属性都有唯一的值
- python - 对python非常陌生,想添加一个名为“Total”的新列,它是其他总数的总和
- python-3.x - 用 Sympy 计算有限集的笛卡尔积
- ios - 加载本地文件到app CoreData的代码逻辑是什么?
- python - 从 Python 中的文本文件中过滤掉坏词
- python - 从网页中提取特定文本
- datastage - 在ibm datastage中读取文件后如何移动文件
- android - 您能否让我知道来自 Google 控制台的“无法在运行时权限之前触发默认处理程序提示”?