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

pla*_*nes 8 java java-ee metamodel jpa-2.0

我刚刚用于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;
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

Ing*_*gel 7

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

没有的场景volatile是这样的:

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