2012-02-09 13 views
0

私は新しいオブジェクトのインスタンス化を避けるために、古いオブジェクトを再び使用する場合に予約するためにPoolオブジェクトを作成しようとしています。私はgoogleをArrayBlockingQueueとし、それを使ってPoolを作る人もいます。しかし、わからない質問が1つあります。オブジェクトが挿入されたときに新しいインスタンスを再作成しますか?例えばArrayBlockingQueue:プールの作成に使用する必要がありますか?

:短い時間後にArrayBlockingQueue<Integer> pool = new ArrayBlockingQueue<Integer>(3);

pool = (3,4,5);

pool.take(5); ==> pool = (3,4); 
pool.put(6); ==>pool = (6,3,4); 

だから、私は疑問に思う(値5との)古いIntegerオブジェクトに割り当てられた6である、またはJavaは新しいものを作成しないと、 6の値を割り当てますか?

感謝:)

+0

質問は非常に不明だったので、私は私の理解の中で最良の編集を提案しました。私はあなたの質問を誤解していないことを願っています。 – posdef

答えて

1

ArrayBlockingQueueには、パラメータタイプの配列が付いています。

private void insert(E x) { 
    items[putIndex] = x; 
    putIndex = inc(putIndex); 
    ++count; 
    notEmpty.signal(); 
} 
ArrayBlockingQueuesource codeによると、 put方法は、実際にこの insertメソッドを呼び出します

Integer[] items; 

として

E[] items; 

とあなたのケースでインスタンス化:だから、内部的には、次のようになります

pool.put(6)に電話するとどうなりますか?int 6はIntegerオブジェクトにボックス化され、メソッドに渡されます(Eは現在Integerです)。実際にはIntegerの新しいインスタンスが作成されると言うのは安全です。

1

あなたはそれが「カプセル化」することによって、Javaに意図されるもので、基礎となる実装を心配してはいけませんを参照してください。 Oracleのドキュメントによると、 "put"は実際に要素を末尾に "挿入"します。だから、「古いもの」の代わりはありません。

0

この場合、値の置き換えが実際に行われることに真剣に疑いがあります。さらに、あなたのコードが膨大な数のオブジェクトを生成し、ゴミ箱に入れない限り、そのようなオブジェクトプールのカスタム実装を行うことは有用ではないでしょうか。

さらに興味深いのは、あなたの質問にスレッドの安全性やマルチスレッドに関することは言及していませんが、これらのタグを使用したことです。あなたはそのようなプールで達成したいのはどういうことでしょうか? ArrayBlockingQueueは、1つ(または多くの)スレッドがオブジェクトをダンプし、1つ(または多く)のスレッドがオブジェクトを取り除くスレッドセーフなコレクションを意図しています。キューからオブジェクトが必要だがオブジェクトがない場合、またはオブジェクトが追加されたにもかかわらずキューに容量がない場合に、異なる動作を提供する方法はかなりあります。 javadocをチェックし、本当にArrayBlockingQueueかどうか確認してください。

0

新しいオブジェクトを右ここに作成されました:

pool.put(6); 

あなたはオートボクシングをしていることに変換されたものを考えるとき、それはより明白です:それは店、

pool.put(new Integer(6)); 

キューは、これらのオブジェクトを作成することも、再利用し、どちらもあなたがそれを与えるもの。

関連する問題