9

org.apache.openjpa.persistence.meta.AnnotationProcessor6JPA2エンティティのMetaModelを生成するために 使用しました。

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

この場合、属性が揮発性とマークされている理由を誰かが説明できますか?

ありがとう。

4

2 に答える 2

7

静的変数を設定するスレッドは、静的変数へのアクセスに使用するスレッドと同じではない可能性があるため、volatileすべてのスレッド間でメモリを同期するには修飾子が必要です。

なしのシナリオvolatileは次のようになります。

  1. スレッドは、JPAプロバイダーが初期化される前に変数にアクセスnullし、静的フィールドを取得します
  2. JPAプロバイダーは別のスレッドから初期化され、静的フィールドをnull以外の値に設定します
  3. スレッドは静的フィールドに再度アクセスします。nullこの場合、スレッドのキャッシュされたメモリは変更を認識せず、すべての静的フィールドに対して戻り続けます。
于 2011-12-19T16:50:01.060 に答える