【问题标题】:OSGi thread-safety cautionsOSGi 线程安全注意事项
【发布时间】:2013-11-30 22:53:11
【问题描述】:
我听说使用低级 OSGi API 通常会引发一些线程安全问题,例如在注册服务实现时(例如在 this presentation 中)。
第一季度。这些是什么问题?有人可以举个例子吗?
特别是我想在我的包中的 OSGi 容器 (Apache Felix) 中安装一个 JPA 包(可能是 EclipseLink),其中 JPA 包与我的包混在一起(有关详细信息,请参阅this question)。
Q2. 如果我只是调用BundleContext.installBundle(),我会遇到什么样的线程安全错误?如果有任何问题,“Spring DM”可以帮我解决这些问题吗?
【问题讨论】:
标签:
thread-safety
osgi
osgi-bundle
【解决方案1】:
一个 OSGi 运行时通常在其中运行许多线程。 OSGi 框架本身可以使用线程来异步传递事件。因此,在 OSGi 中运行的代码通常应该是线程安全的,因为它可以从不同的线程中调用。这包括诸如侦听器和激活器之类的回调以及服务。 Java EE 通常只希望在应用程序中运行单个线程(例如 ThreadContextClassLoader),并且不希望应用程序创建线程。因此,我希望该演示文稿中提出的谨慎是将代码从 Java EE 环境中引入,在该环境中代码不必担心并发性,而在 OSGi 中,代码应该为并发性做好准备。
OSGi 规范都是为并发设计的。您应该在整个 OSGi API 中看到 @ThreadSafe 和 @Immutable javadoc 标签。只有在非常有限的情况下,您才会看到 @NotThreadSafe javadoc 标签。
【解决方案2】:
Q1:OSGi 包存在于并发世界中,因此任何可被其他人调用的代码都会引发线程安全问题。
Q2:安装包会导致事件,这些事件在其他线程上传递,因此如果您订阅这些事件,则在共享状态时必须小心。
Q3:不,Spring DM 不会为您解决这个问题。
总体而言,如果您将服务模型与声明式服务 (DS) 一起使用,OSGi 实际上可以最大限度地减少并发问题。我发现 DS 的严格时间安排确保了重要的先发生关系,从而避免了大多数并发问题。