在EMF模型中使用Java关键字volatile

在EMF模型中使用Java关键字volatile,java,concurrency,eclipse-rcp,volatile,emf,Java,Concurrency,Eclipse Rcp,Volatile,Emf,我们将EMF2.7与多线程EclipseRCP3.x应用程序一起使用。现在,一些EMF模型和特性/属性分别由不同的线程访问。因此,我们需要使这些变量变得易变 在.ecore或.ecorediag文件中是否有方法配置EMF模型的属性,使代码生成器自动在生成的模型代码中添加volatile关键字?或者我们必须在生成的代码中手动添加它(尽管它不合适) 如果可以在模型定义中而不是在生成的代码中指定“volatile”,这将非常有用 以下是在生成的EMF模型中手动添加的volatile的示例: publi

我们将EMF2.7与多线程EclipseRCP3.x应用程序一起使用。现在,一些EMF模型和特性/属性分别由不同的线程访问。因此,我们需要使这些变量变得易变

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

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

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

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

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

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


注意:我实际上还没有尝试过,但我猜更改应该会奏效。

默认情况下,EMF生成的模型不适合多线程。EMF中的“Volatile”表示属性(也称为feature)不会生成任何字段,它与Java中的Volatile语法无关。 (您应该阅读EMF手册或至少EMF参考卡)

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


在需要多线程EMF的应用程序的情况下,考虑使用支持事务的EMF。

不,这不起作用。不幸的是,EMF有自己的volatile概念,“volatile属性是指在运行时没有为其留出存储空间的属性”[EMFbook]。因此,当我这样做时,生成器实际上删除了类变量并创建了一个带有TODO的空访问器方法,如下所示:
@Override public ESummary getSummary(){//TODO:实现此方法以返回'Summary'属性//确保删除@generated或将其标记为@generated而不是抛出新的UnsupportedOperationException();}
你是对的,它不是。在这种情况下,我找不到任何属性或其他设置的组合,这些属性或设置可能会将其标记为
易失性
@Generated NOT
可能是唯一的选项。