为什么使用volatile成员生成JPA2 MetaModel?

时间:2011-12-19 16:40:53

标签: java java-ee jpa-2.0 metamodel

我刚刚使用org.apache.openjpa.persistence.meta.AnnotationProcessor6为我的JPA2实体生成MetaModel。

@javax.annotation.Generated
(value="org.apache.openjpa.persistence.meta.AnnotationProcessor6",
   date="Tue Nov 22 09:49:03 CET 2011")
public class Entity_ {
    public static volatile SingularAttribute<Entity,Entity> id;
    public static volatile SingularAttribute<Entity,String> value;
    public static volatile SingularAttribute<Entity,String> order;
}

有人可以解释为什么在这种情况下属性被标记为volatile?

感谢。

2 个答案:

答案 0 :(得分:7)

设置静态变量的线程可能与用于访问它们的线程不同,因此需要volatile修饰符来同步所有线程之间的内存。

没有volatile的方案是这样的:

  1. 您的线程在初始化JPA提供程序之前访问变量,并获取静态字段的null
  2. JPA提供程序从不同的线程初始化,并将静态字段设置为非空值
  3. 您的线程再次访问静态字段。在这种情况下,线程的缓存内存将不会看到更改,并继续为所有静态字段返回null

答案 1 :(得分:2)

尽管有meaning of volatile keyword和Ingo的回答,但值得注意的是每个JPA生成器都需要生成易失性元数据字段(JPA 2.0 FR, 6.2.1.1 Canonical Metamodel )。

在第199页上,您可以阅读:

  

对于声明的每个持久的非集合值属性y   类X,其中y的类型是Y,元模型类必须包含一个   声明如下:

     

public static volatile SingularAttribute<X, Y>   ÿ;