【问题标题】:Why do the JPA2 MetaModel get generated with volatile members?为什么 JPA2 元模型会使用 volatile 成员生成?
【发布时间】:2011-12-20 01:57:55
【问题描述】:

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

谢谢。

【问题讨论】:

    标签: java jakarta-ee jpa-2.0 metamodel


    【解决方案1】:

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

    没有volatile的场景是这样的:

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

    【讨论】:

    • 感谢 Ingo - 觉得我快疯了,当然它们需要初始化!根据规范“创建持久性单元的实体管理器工厂时,持久性提供者有责任初始化持久性单元的元模型类的状态。”我看到了声纳警告,但没有考虑清楚......已接受答案
    • 所以?我们应该忽略像“误报”声纳警告而不是修复它吗? @planetjones
    【解决方案2】:

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

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

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

    public static volatile SingularAttribute&lt;X, Y&gt; 是的;

    【讨论】:

      猜你喜欢
      • 2015-05-06
      • 2011-09-19
      • 1970-01-01
      • 2011-05-27
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多