2012-02-29 5 views
0

ここで何が起こっているのか把握しようとするだけの時間が失われましたが、私はついに何かに出ていると思います。PicoContainerキャッシュをスレッドセーフにすることはできますか?

私たちは、私はシングルトン動作を引き起こすことになっていたと思っただけで、キャッシングをオンにいくつかのかなりの正常PicoContainerコード、持っている:しかし

container.as(Characteristics.CACHE).addComponent(Service.class, ServiceImpl.class); 

を我々が今日見られるように、我々は明らかに構築されているコンポーネントを持っています一度ではなく、四回。私自身のコンピュータ上で、他のいくつかの開発マシン上で再現できるものではありません。

さらに調査した結果、複数のスレッドがPicoContainerに同時に同じコンポーネントをルックアップさせ、1つのコピーをインスタンス化して他の3つのスレッドを待機させるのではなく、4つのインスタンス

PicoContainerで本当に特異な動作を得るには、比較的簡単な方法がありますか?

答えて

2

pico-containerは、扱っているケースの明示的な同期メカニズムが必要です。 Here is a linkこの動作を文書化し、同じことに対する解決策を提案します。

は、コンポーネントがキャッシュされているインスタンスの つもりで、同時に二つのスレッドによって作成され、このリンク

を引用するには、キャッシュに最初のインスタンスの例小さな 割合で可能です を2番目のインスタンスに置き換えます。

その他のリンクはcachingです。

+0

このための死後のちょっとした問題です。これは実際には、それを持っている人のための問題を修正し、少なくとも短期間には私たちが書いたすべてのテストを修正しました。長期的には、テストが実行される10,000回のうち1回、PicoContainerはコンポーネントの複数インスタンスを作成します。だから私はそれがスレッドセーフなものではないと主張していますが、Lockingビヘイビアを使用しても、それを使用していない場合よりも若干優れています。 – Trejkaz

+0

真。私は[Double Check Lock](http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html)は、複数インスタンスの可能性をさらに減らすことができると思います。特に[メモリモデル]が改善されたJDK5(http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html)。 – Santosh

+0

私は、PicoContainerがどのように動作するのかを掘り下げ、本当にスレッドセーフなコンポーネントアダプタを作るためにGuavaの並行処理のいくつかを試してみると思っていました。 – Trejkaz

関連する問題