2011-12-19 20 views
6

Właśnie użyłem org.apache.openjpa.persistence.meta.AnnotationProcessor6 do wygenerowania MetaModelu dla moich jednostek JPA2.Dlaczego MetaModel JPA2 jest generowany z niestabilnymi elementami?

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

Czy ktoś może wyjaśnić, dlaczego atrybuty są oznaczone jako niestabilne w tym przypadku?

Dzięki.

Odpowiedz

7

Wątek, który ustawia zmienne statyczne, może nie być taki sam, jak wątek używany do uzyskania do nich dostępu, więc modyfikator volatile jest wymagany do synchronizacji pamięci między wszystkimi wątkami.

Scenariusz bez volatile jest tak:

  1. Twój wątek dostęp zmienne przed dostawca JPA jest inicjowany i pobiera null dla statycznych pól
  2. Dostawca JPA jest inicjowana z innego wątku i zestawy pola statyczne na wartości inne niż null
  3. Twój wątek ponownie uzyskuje dostęp do pól statycznych. W tym przypadku buforowana pamięć wątku nie zobaczy zmian i nadal będzie zwracać null dla wszystkich pól statycznych.
+0

Dzięki Ingo - myślę, że oszaleję, oczywiście, że trzeba je zainicjować! Zgodnie ze specyfikacją "Kiedy tworzona jest fabryka podmiotu zarządzającego jednostką wytrwałości, obowiązkiem dostawcy trwałości jest zainicjowanie stanu klas metamodelu jednostki utrwalania." Widziałem ostrzeżenia sonaru i nie przemyślałem ... Zaakceptowana odpowiedź – planetjones

2

Pomimo meaning of volatile keyword i odpowiedzi Ingo jest, to warto zauważyć, że każdy generator JPA jest wymagane generowania lotnych pola metadanych (JPA 2.0 FR, 6.2.1.1 Canonical metamodel).

Na stronie 199 można przeczytać:

dla każdego uporczywego niepobieranie wartościach y atrybutu zadeklarowanego przez klasy X, gdzie typ Y jest Y, klasa metamodel musi zawierać oświadczenie jako następuje:

public static volatile SingularAttribute<X, Y> y;

Powiązane problemy