2011-12-19 34 views
6

Acabo de utilizar org.apache.openjpa.persistence.meta.AnnotationProcessor6 para generar el MetaModel para mis entidades JPA2.¿Por qué se genera el MetaModel JPA2 con miembros volátiles?

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

¿Puede alguien explicar por qué los atributos están marcados como volátiles en este caso?

Gracias.

Respuesta

7

El hilo que establece las variables estáticas podría no ser el mismo que el hilo que se utiliza para acceder a ellos, por lo que se requiere el modificador volatile para sincronizar la memoria entre todos los hilos.

El escenario sin volatile es así:

  1. Su hilo accede a las variables antes de inicializar el proveedor JPA y obtiene null para los campos estáticos
  2. El proveedor JPA se inicializa a partir de un hilo y conjuntos diferentes los campos estáticos a valores no nulos
  3. Su thread accede nuevamente a los campos estáticos. En este caso, la memoria en caché de su hilo no verá los cambios y continuará devolviendo null para todos los campos estáticos.
+0

Gracias Ingo - creo que me estoy volviendo loco, ¡por supuesto que necesitan ser inicializados! Según la especificación "Cuando se crea la fábrica del administrador de entidades para una unidad de persistencia, es responsabilidad del proveedor de persistencia inicializar el estado de las clases de metamodelo de la unidad de persistencia". Vi las advertencias del Sonar y no pensé ... Respuesta aceptada – planetjones

2

A pesar de la meaning of volatile keyword y la respuesta de Ingo, vale la pena darse cuenta de que cada generador JPA es requerida para generar campos volátiles metadatos (JPA 2.0 FR, 6.2.1.1 Metamodel Canonical).

En la página 199 se puede leer:

Por cada atributo y un valor de no-colección permanente declarado por clase X, donde el tipo de y es Y, la clase metamodelo debe contener una declaración como sigue:

public static volatile SingularAttribute<X, Y> y;

Cuestiones relacionadas