Почему метамодель JPA2 генерируется с изменчивыми членами?
Я только что использовал org.apache.openjpa.persistence.meta.AnnotationProcessor6
создать метамодель для моих сущностей JPA2.
@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;
}
Может кто-нибудь объяснить, почему атрибуты помечены как изменчивые в этом случае?
Благодарю.
2 ответа
Поток, который устанавливает статические переменные, может не совпадать с потоком, который вы используете для доступа к ним, поэтому volatile
Модификатор необходим для синхронизации памяти между всеми потоками.
Сценарий без volatile
это так:
- Ваш поток обращается к переменным до инициализации поставщика JPA и получает
null
для статических полей - Поставщик JPA инициализируется из другого потока и устанавливает для статических полей ненулевые значения
- Ваш поток снова обращается к статическим полям. В этом случае кэшированная память вашего потока не увидит изменений и продолжит возвращаться
null
для всех статических полей.
Несмотря на значение volatile
Ключевое слово и ответ Инго, стоит отметить, что каждый генератор JPA требуется для создания изменчивых полей метаданных (JPA 2.0 FR, 6.2.1.1 Каноническая метамодель).
На странице 199 вы можете прочитать:
Для каждого постоянного незначного атрибута y, объявленного классом X, где тип y равен Y, класс метамодели должен содержать объявление следующим образом:
public static volatile SingularAttribute<X, Y>
у;