2016-03-30 8 views
0

ページまたはコンポーネントクラスに、非同期オブジェクトである1つのインスタンスフィールドがある場合、f.ex. ArrayList、このフィールドへのアクセスが同期されるべきである場合、アプリケーションはこのフィールドを構造的に変更するコードを持っていますか?Tapestryページまたはコンポーネントで、インスタンスのフィールドアクセスを同期する必要がありますか?

F.ex:

public class MyPageOrComponent 
{ 
    @Persist 
    private List<String> myList; 

    void setupRender() 
    { 
     if (this.myList == null) 
     { 
      this.myList = new ArrayList<>(); 
     } 
    } 

    void afterRender(MarkupWriter writer) 
    { 
     // Should this be synchronized ? 

     if (someCondition) 
     { 
      this.myList.add(something); 
     } 
     else 
     { 
      this.myList.remove(something); 
     } 
    } 
} 

私はタペストリーがページまたはコンポーネントクラスのインスタンスを1つだけ作成し、それが接続されているすべてのクライアントのために、このインスタンスを使用していることを理解しているように見えるので、私は求めている(しかし下さいこれが真実でないなら私を修正してください)。

答えて

1

簡単に言えば、答えはいいえ、タペストリーがあなたのためにする必要はありません。 Tapestryは、実行時にページとクラスを変換して、フィールドとやりとりするたびに実際にはインスタンス変数ではなく、スレッドセーフである管理された変数で作業するようにします。完全な内部動作は私を超えていますが、変換についての簡単な言及はhereです。

1つの警告として、解読時にページ変数やコンポーネント変数をインスタンス化しないでください。私はこの周りにいくつかの奇妙な行動を見た。だから、これをしない:

private List<String> myList = new ArrayList<String>; 
1

タペストリーは、ページやコンポーネントを変換するために、いくつかのランタイムバイトコードの魔法を使用しています。ページとコンポーネントはシングルトンですが、プロパティはPerThreadValueによってバッキングされるように変換されます。これは、各要求がそれ自身の値のコピーを取得するので、同期が必要ないことを意味します。

@joostschoutenが示唆しているように、フィールド宣言では変更可能なプロパティを決して初期化しないでください。彼が議論している奇妙な振る舞いは、すべてのリクエストで共有されるため(初期化子はページ/コンポーネントシングルトンに対して1回のみ起動されるため)、発生します。変更可能なフィールドはレンダリングメソッドで初期化する必要があります(@SetupRenderなど)

関連する問題