ArrayBlockingQueue: следует использовать для создания пула? - PullRequest
0 голосов
/ 09 февраля 2012

Я пытаюсь создать объект Pool, чтобы зарезервировать старые объекты в случае их повторного использования (чтобы избежать создания новых объектов).Я гуглю это ArrayBlockingQueue и некоторые люди используют его для создания Pool.Но есть один вопрос, который я не знаю: воссоздает ли он новый экземпляр при вставке в него объекта.

Например: ArrayBlockingQueue<Integer> pool = new ArrayBlockingQueue<Integer>(3);

через короткое время: pool = (3,4,5);

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

Итак, мне интересно, 6 назначено старому объекту Integer (со значением 5), или Java создает новый и присваивает его значение как 6?

спасибо:)

Ответы [ 4 ]

1 голос
/ 09 февраля 2012

ArrayBlockingQueue поддерживается массивом типа параметра.Внутренне это будет выглядеть примерно так:

E[] items;

, и в вашем случае оно будет выглядеть как

Integer[] items;

Согласно исходному коду из ArrayBlockingQueue,put метод фактически вызывает этот insert метод:

private void insert(E x) {
    items[putIndex] = x;
    putIndex = inc(putIndex);
    ++count;
    notEmpty.signal();
}

Итак, что происходит, когда вы вызываете pool.put(6), так это то, что int 6 упакован в объект Integer и передан методу(поскольку E сейчас Integer).Так что можно с уверенностью сказать, что он действительно создает новый экземпляр Integer.

1 голос
/ 09 февраля 2012

Обратите внимание, что вам не следует беспокоиться о базовой реализации, то есть о том, что подразумевается в Java под "инкапсуляцией" Согласно документации Oracle, «put» фактически «вставляет» элемент в хвост. Так что, я полагаю, нет замены "старых объектов".

0 голосов
/ 09 февраля 2012

Новый объект был создан прямо здесь:

pool.put(6);

Более очевидно, когда вы думаете, что автобокс преобразует это в:

pool.put(new Integer(6));

Очередь не создает и не использует эти объектыон хранит те, которые вы ему даете.

0 голосов
/ 09 февраля 2012

Я бы серьезно сомневался, что любая замена значений будет в этом случае актуальной.Кроме того, я не уверен, что иметь собственную реализацию такого пула объектов было бы полезно, если только ваш код не генерирует и не уничтожает огромное количество объектов.

Что более интересно, вы ничего не упоминаете о безопасности потоков или многопоточности в своем вопросе, но вы использовали эти теги.Что именно вы хотите достичь с таким бассейном?ArrayBlockingQueue предназначено как потокобезопасная коллекция, в которой один (или несколько) потоков сбрасывают объекты, а один (или несколько) потоков удаляет объекты.Существует довольно много методов для предоставления различных вариантов поведения в случае, если объекты требуются из очереди, но их нет, или когда объекты добавляются, но в очереди нет места.Вы должны проверить javadoc и посмотреть, действительно ли вы хотите ArrayBlockingQueue.

...