我刚刚使用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吗?
谢谢.
解决方法
设置静态变量的线程可能与用于访问它们的线程不同,因此需要使用volatile修饰符来同步所有线程之间的内存.
没有volatile的场景是这样的:
>您的线程在初始化JPA提供程序之前访问变量,并为静态字段获取null> JPA提供程序从不同的线程初始化,并将静态字段设置为非空值>您的线程再次访问静态字段.在这种情况下,线程的缓存内存将不会看到更改,并继续为所有静态字段返回null.