2011-12-19 19 views
6

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

@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吗?

谢谢。

回答

7

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

没有volatile的情形是这样的:

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

谢谢因戈 - 我想我会生气,当然他们需要初始化!按照规范“创建持久性单元的实体管理器工厂时,持久性提供者有责任初始化持久性单元的元模型类的状态。”我看到Sonar的警告,并没有想通过...接受的答案 – planetjones 2011-12-20 11:02:55

2

尽管meaning of volatile keyword和英戈的回答,这是值得注意的是,每一个JPA发生器需要产生挥发性元数据字段(JPA 2.0 FR,6.2.1.1规范元模型)。

在199页面,您可以阅读:

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

public static volatile SingularAttribute<X, Y> y;