9

我刚刚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 吗?

谢谢。

4

2 回答 2

7

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

没有的场景volatile是这样的:

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

尽管关键字和 Ingo 的答案的含义volatile,但值得注意的是,每个 JPA 生成器都需要生成易失性元数据字段(JPA 2.0 FR,6.2.1.1 Canonical Metamodel)。

在第 199 页,您可以阅读:

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

public static volatile SingularAttribute<X, Y> 是;

于 2011-12-19T17:57:55.737 回答