【问题标题】:Use Java keyword volatile within an EMF model在 EMF 模型中使用 Java 关键字 volatile
【发布时间】:2015-02-16 05:25:38
【问题描述】:

我们将 EMF 2.7 与多线程 Eclipse RCP 3.x 应用程序一起使用。现在,一些 EMF 模型和特性/属性分别由不同的线程访问。所以我们需要使这些变量volatile [1]。

.ecore 或 .ecorediag 文件中是否有方法可以配置 EMF 模型的属性,使代码生成器会在生成的模型代码中自动添加 volatile 关键字?还是我们必须在生成的代码中手动添加它(尽管它不合适..)?

如果可以在模型定义中而不是在生成的代码中指定“volatile”,那将非常有用。

这是在生成的 EMF 模型中手动添加 volatile 的示例:

public class EGuiStateImpl extends MinimalEObjectImpl.Container implements 
     EGuiState {
/**
* @generated NOT
*/
protected volatile ESummary summary;

[1] Java 关键字volatile 用于表示变量的值将被不同的线程修改。

【问题讨论】:

    标签: java concurrency eclipse-rcp volatile emf


    【解决方案1】:

    默认情况下,EMF 生成的模型不准备用于多线程。 EMF 中的“Volatile”意味着该属性(又名特性)不会生成任何字段,它与 Java 中的 volatile 语法无关。 (您应该阅读 EMF 书籍或至少阅读 EMF Refcardz)

    您始终可以修改 javajet 模板以生成不同的代码,但同样不建议这样做,因为默认 EMF 生成不是为多线程设计的。

    如果您需要基于多线程 EMF 的应用程序,请考虑使用还支持事务的 EMF CDO

    【讨论】:

      【解决方案2】:

      在 EClass 下的 ecore 模型中,选择要使其变为 volatile 的 EAttribute 或 EReference。右键单击->显示属性。在属性视图的末尾有一个Volatile 设置,默认为“false”。

      注意:我实际上并没有尝试过,但我猜改变它应该会起作用。

      【讨论】:

      • 不,这不起作用。不幸的是,EMF 有自己的 volatile 概念,“一个 volatile 属性是在运行时没有为其预留存储空间的属性” [EMFbook]。所以当我这样做时,生成器实际上会删除类变量并创建一个带有 TODO 的空访问器方法,如下所示:@Override public ESummary getSummary() { // TODO: implement this method to return the 'Summary' attribute // Ensure that you remove @generated or mark it @generated NOT throw new UnsupportedOperationException(); }
      • 你是对的,它没有。在这种情况下,我找不到将其标记为volatile 的任何属性组合或其他设置。 @Generated NOT 可能是唯一的选择。
      猜你喜欢
      • 2016-02-12
      • 1970-01-01
      • 2011-02-08
      • 2012-06-01
      • 2022-01-23
      • 2012-04-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-18
      相关资源
      最近更新 更多