OSGi线程安全注意事项

时间:2013-11-30 22:53:11

标签: thread-safety osgi osgi-bundle

我听说使用低级OSGi API通常会引发一些线程安全问题,例如在注册服务实现时(例如this presentation)。

Q1 即可。那是什么问题?有人可以展示一个例子吗?

特别是我想在我的bundle中的OSGi容器(Apache Felix)中安装一个JPA包(可能是EclipseLink),其中JPA包与我的包有关(有关详细信息,请参阅this question)。

Q2。如果我只是致电BundleContext.installBundle(),我可以获得什么样的线程安全漏洞?如果有任何问题,“Spring DM”可以帮助我解决这些问题吗?

2 个答案:

答案 0 :(得分:2)

OSGi运行时通常在其中有许多线程运行。 OSGi框架本身可以使用线程异步传递事件。因此,在OSGi中运行的代码通常应该是线程安全的,因为它可以从不同的线程调用。这包括回调,如监听器和激活器以及服务。 Java EE通常期望在应用程序中仅运行单个线程(例如,ThreadContextClassLoader),并且期望应用程序不创建线程。所以我希望在该演示文稿中提出的警告是关于从Java EE环境中引入代码,其中代码不必担心OSGi的并发性,其中代码应该为并发做好准备。

OSGi规范都是为并发而设计的。您应该在整个OSGi API中看到@ThreadSafe和@Immutable javadoc标记。只有在非常有限的情况下才会看到@NotThreadSafe javadoc标签。

答案 1 :(得分:1)

Q1:OSGi捆绑包存在于并发世界中,因此任何可由其他人调用的代码都会引起线程安全问题。 Q2:安装捆绑包导致事件,这些事件在其他线程上传递,因此如果您订阅这些事件,则在共享状态时必须小心。 Q3:不,Spring DM不能为您解决这个问题。

总的来说,如果您将服务模型与Declarative Services(DS)一起使用,OSGi实际上可以最大限度地减少并发问题。我发现DS的严格时序确保了避免大多数并发问题的重要发生之前的关系。