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

Posted

技术标签:

【中文标题】在 BundleActivator 中有一个不同步的静态 BundleContext 引用真的安全吗?【英文标题】:Is it really safe to have an unsynchronized static BundleContext reference in the BundleActivator? 【发布时间】:2011-11-19 16:45:13 【问题描述】:

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

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

在“正常”上下文中,getter 和 setter 都需要同步,或者我们必须使用 volatile,以确保以后调用 getter 的任何 Thread 都能真正看到静态字段的当前状态。

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

我无法想象 Eclipse 会默认生成纯错误代码,但我也看不出这是如何工作的。

【问题讨论】:

【参考方案1】:

我同意生成的代码是不正确的,Eclipse PDE 会生成不正确的代码一点也不让我感到惊讶。不需要这个静态字段,实际上在大多数情况下激活器本身是无用的。

【讨论】:

同时,我发现OSGi没有提供关于“线程”的保证,所以代码不是线程安全的,如果按原样使用会导致问题。

以上是关于在 BundleActivator 中有一个不同步的静态 BundleContext 引用真的安全吗?的主要内容,如果未能解决你的问题,请参考以下文章

HashTable集合的同步表现在哪?于和hashMap的异步在编译执行过程中有何区别?

ava中有几种方法可以实现一个线程?用啥关键字修饰同步方法? stop()和suspend()方法为何不推荐使用?

java 中有几种方法可以实现一个线程? 用什么关键字修 饰同步方法? stop()和 suspend()方法为何不推荐使用?

Java面试题23 java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用?

SQL Server 可更新订阅中有行筛选的同步复制移除项目而不重新初始化所有订阅!

在同一个类中执行同步和非同步方法