gpt4 book ai didi

java - ServiceListener 和 ServiceTracker 调用提供了哪些顺序保证?

转载 作者:搜寻专家 更新时间:2023-11-01 00:53:37 27 4
gpt4 key购买 nike

我试图了解为服务事件提供了哪些保证。

OSGi 规范说 ServiceEvents 是同步的,我认为这意味着 ServiceListener 将不会收到带有 UNREGISTERING ServiceEvent 的 serviceChanged() 调用,直到带有 REGISTERED ServiceEvent 的 serviceChanged() 调用完成。这是正确的吗?

我还查看了 ServiceTracker 的源代码。它似乎试图应对这两个 serviceChanged() 调用重叠的情况。这可能吗?

调用 ServiceTrackerCustomizer 时是否有任何类似的保证?

最佳答案

这是一个非常棘手的问题。当服务在 OSGi 中注册时,事件将被处理并通知所有相关方(服务监听器、服务跟踪器和声明式服务运行时)。每个感兴趣的方都有机会处理该事件。处理事件可以包括注册或注销附加服务。由于 ServiceEvent 通知的同步行为,这些事件随后被分派(dispatch)给相关方。在一个很长的依赖链中,你最终会得到一棵通知树,你去那里注册一个服务,它会导致一大群新人注册。我知道这一点,因为它可以使性能调整 OSGi 启动成为一项非常具有挑战性的练习,因为您的简单注册服务调用会因未知数量的服务激活而收费。

要具体回答您的问题,它不是事件的多线程问题,而是可重入的问题。那就是处理您的注册事件的人可以在处理完整树之前通过另一个事件通知返回给您。这是他们强烈建议您永远不要在持有锁的同时注册或取消注册服务的原因之一,否则您可能会死锁事件调度程序线程。另一种保持安全的好方法是拥有一个包依赖树,而不是一个图。包之间的循环依赖,即使类编译也会导致真正的问题。

希望对您有所帮助。如果您想阅读更多关于此类内容的信息,可以阅读一本关于 OSGi 和 Equinox 的新书。它现在可以用于粗剪,并且应该很快可以打印。 http://my.safaribooksonline.com/9780321561510

关于java - ServiceListener 和 ServiceTracker 调用提供了哪些顺序保证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2210418/

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