2011-12-19 4 views
6

Ho appena usato org.apache.openjpa.persistence.meta.AnnotationProcessor6 per generare il MetaModel per le mie entità JPA2.Perché il MetaModel JPA2 viene generato con membri volatili?

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

Qualcuno può spiegare perché gli attributi sono contrassegnati come volatili in questo caso?

Grazie.

risposta

7

Il thread che imposta le variabili statiche potrebbe non essere uguale al thread che si utilizza per accedervi, pertanto è necessario il modificatore volatile per sincronizzare la memoria tra tutti i thread.

Lo scenario senza volatile è come questo:

  1. tuo thread accede alle variabili prima che il provider JPA viene inizializzato e ottiene null per i campi statici
  2. Il provider JPA viene inizializzato da un filo e set diverso i campi statici ai valori non nulli
  3. Il thread accede nuovamente ai campi statici. In questo caso, la memoria cache del thread non vedrà le modifiche e continuerà a restituire null per tutti i campi statici.
+0

Grazie Ingo - penso che sto impazzendo, ovviamente devono essere inizializzati! Come da specifica "Quando viene creata la factory di entity manager per un'unità di persistenza, è responsabilità del provider di persistenza inizializzare lo stato delle classi metamodel dell'unità di persistenza." Ho visto gli avvertimenti del sonar e non ho pensato a ... risposta accettata – planetjones

2

Nonostante la meaning of volatile keyword e la risposta di Ingo, è importante notare che ogni generatore di APP è richiesto per generano campi di metadati volatili (JPA 2.0 FR, 6.2.1.1 Canonical Metamodel).

A pagina 199 si legge:

Per ogni persistente y attributo non-raccolta-valore dichiarato dal classe X, dove il tipo di y è Y, la classe metamodello deve contenere una dichiarazione come segue:

public static volatile SingularAttribute<X, Y> y;