BundleActivator中有一个非同步的静态BundleContext引用真的很安全吗?

时间:2011-09-18 14:25:52

标签: eclipse osgi

如果我在Eclipse中创建一个“插件项目”,它会创建一个默认的BundleActivator实现,它只是在一个非同步的静态字段中设置BundleContext。

由于它也创建了一个公共静态getter,这看起来并不是Thread-safe,因为即使OSGi在调用Activator时执行了一些同步,我怎么知道我调用getter的任何代码也会运行在同一个同步块内?

在“普通”上下文中,getter和setter都需要同步,或者我们必须使用volatile,以确保无论Thread调用getter后来实际上看到的是静态字段的当前状态。

如果字段只设置了一次,那就不会有问题了,但是我知道在JVM的生命周期中可以多次启动和停止bundle,在这种情况下,可以想象一个Thread有已经是该字段的缓存版本,并且由于缺乏同步而不会看到更改。

我无法想象默认情况下Eclipse会生成错误的代码,但我看不出它是如何工作的。

1 个答案:

答案 0 :(得分:2)

我同意生成的代码不正确,并且Eclipse PDE会生成错误的代码并不让我感到惊讶。不需要这个静态场,事实上在大多数情况下,激活器本身是无用的。