gpt4 book ai didi

java - 通过最终安全发布

转载 作者:搜寻专家 更新时间:2023-11-01 01:14:47 24 4
gpt4 key购买 nike

即使经过this ,我仍然不清楚 final 的使用如何导致下面代码中的安全发布。谁能给个通俗易懂的解释。

public class SafeListener
{
private final EventListener listener;

private SafeListener()
{
listener = new EventListener()
{ public void onEvent(Event e)
{ doSomething(e); }
};
}

public static SafeListener newInstance(EventSource source)
{
SafeListener safe = new SafeListener();
source.registerListener(safe.listener);
return safe;
}
}

最佳答案

编辑添加:关于 origins of Java and JSR-133's final behavior 的有趣观点.

有关 final 如何在新 JMM 中工作的规范引用,以确保安全发布:http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#finalRight

简单回顾一下,我认为您的代码代表了对 EventSource source 对象的“安全”发布,它可能会在不同的线程中将事件回调发送给 listener。您可以保证在传递的 safe.listener 引用上运行的线程将看到一个完全初始化的 listener 字段。这不会对与调用 onEvent 或与对象状态的其他交互相关的其他同步问题做出任何进一步保证。

你的代码保证的是,当SafeListener的构造函数返回静态方法内部的引用时,listener字段不会以未写入的状态出现(即使没有显式同步)。例如:假设线程 A 调用 newInstance(),导致对 listener 字段进行赋值。假设线程 B 能够取消引用 listener 字段。然后,即使没有任何其他同步,线程 B 也可以保证看到写入 listener = new EventListener()...。如果该字段不是 final,您将不会收到该保证。有几种(其他)方法可以提供不同性能和可读性的保证(显式同步、使用原子引用、使用 volatile)。

并非所有合法的东西都是可取的。建议你看看JCiP也许这个article on safe publication techniques .

最近的一个相关问题在这里:"Memory barriers and coding..." , "Java multi-threading & Safe Publication" .

关于java - 通过最终安全发布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3974350/

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