Question

I have just used org.apache.openjpa.persistence.meta.AnnotationProcessor6 to generate the MetaModel for my JPA2 entities.

@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;
}

Can someone please explain why the attributes are marked volatile in this case?

Thanks.

Was it helpful?

Solution

The thread that sets the static variables might not be the same as the thread that you use to access them, so the volatile modifier is required to synchronize memory between all threads.

The scenario without volatile is like this:

  1. Your thread accesses the variables before the JPA provider is initialized and gets null for the static fields
  2. The JPA provider is initialized from a different thread and sets the static fields to non-null values
  3. Your thread accesses the static fields again. In this case the cached memory of your thread will not see the changes and continue to return null for all static fields.

OTHER TIPS

Despite the meaning of volatile keyword and Ingo's answer, it's worth noticing that every JPA generator is required to generate volatile metadata fields (JPA 2.0 FR, 6.2.1.1 Canonical Metamodel).

On page 199 you can read:

For every persistent non-collection-valued attribute y declared by class X, where the type of y is Y, the metamodel class must contain a declaration as follows:

public static volatile SingularAttribute<X, Y> y;

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top