http://php.net/manual/en/function.array-reverse.php :
$newArray = array_reverse($theArray, true);
Важной частью является параметр true
который сохраняет ключи.
Не убежден? Вы можете увидеть это в действии на этой процедуре кодирования .
Вы по существу задаете три различных вопроса (два из них явно и один неявно.) Здесь они с моими ответами:
1. Я должен сделать свою собственную синхронизацию, если я использую java.util.ConcurrentLinkedQueue
?
Атомарные операции на параллельных наборах синхронизируются для Вас. Другими словами, каждый отдельный вызов очереди гарантируется ориентированный на многопотоковое исполнение без любого действия с Вашей стороны. То, что не , гарантировало ориентированный на многопотоковое исполнение, любые операции, которые Вы выполняете на наборе, которые являются неатомарными.
, Например, это ориентировано на многопотоковое исполнение без любого действия с Вашей стороны:
queue.add(obj);
или
queue.poll(obj);
Однако; неатомарные вызовы очереди не автоматически ориентированы на многопотоковое исполнение. Например, следующие операции не автоматически ориентированы на многопотоковое исполнение:
if(!queue.isEmpty()) {
queue.poll(obj);
}
, Что последний не ориентирован на многопотоковое исполнение, поскольку очень возможно, что между временем isEmpty назван и опрос времени называют, другие потоки добавят или удалят объекты из очереди. Ориентированный на многопотоковое исполнение способ выполнить это похож на это:
synchronized(queue) {
if(!queue.isEmpty()) {
queue.poll(obj);
}
}
Снова... атомарные вызовы очереди автоматически ориентированы на многопотоковое исполнение. Неатомарные вызовы не.
2. Я, как гарантируют, не потеряю вызовы java.util.ConcurrentLinkedQueue
, если будет 1 000 одновременных запросов?
, поскольку это - неограниченная реализация, Вам гарантируют это, неважно, сколько одновременных запросов для создания очередь не потеряет те запросы (из-за параллелизма очереди... у Вас могла бы закончиться память или некоторые такой..., но сама реализация очереди не будут Вашим ограничивающим фактором.) В веб-приложении, существуют другие возможности "потерять" запросы, но синхронизация (или отсутствие этого) очереди не будет Вашей причиной.
3. Эти java.util.ConcurrentLinkedQueue
будет работать достаточно хорошо?
Как правило, мы говорим о "правильности", когда мы говорим о параллелизме. То, что я имею в виду, то, что Параллельные классы гарантируют, что они ориентированы на многопотоковое исполнение (или устойчивы против мертвой блокировки, исчерпания ресурсов, и т.д.), Когда мы говорим об этом, мы не делаем гарантий о производительности (как быстро звонит в набор) - мы только гарантируем, что они "корректны".
Однако; ConcurrentLinkedQueue является реализацией "без ожидания", таким образом, это, вероятно, столь производительно, как можно добраться. Единственный способ гарантировать производительность загрузки Вашего сервлета (включая использование параллельных классов) состоит в том, чтобы протестировать его при загрузке.
Помните, что очередь только ориентирована на многопотоковое исполнение для вызовов единственному участнику. Не пишите код как это и ожидайте, что он будет работать:
if (queue.Count!=0)
queue.Dequeue().DoSomething();
Промежуточный эти две операции, другой поток, возможно, исключил последний элемент из очереди. Я не являюсь близким с наборами Java, но я предполагаю, что Двухсторонняя очередь в таком случае возвратилась бы null
, дав Вам исключение.
, Так как очередь ориентирована на многопотоковое исполнение, Вы не должны выполнять синхронизации для обеспечения потокобезопасности. Однако необходимо удостовериться, чтобы все потоки имели равный доступ к очереди для предотвращения исчерпания ресурсов, активного ожидания, и т.д.
, Так как очередь неограниченна, размер очереди ограничен только объемом памяти, который Вы имеете в наличии.
Да, для Ваших двух вопросов.
параллельная очередь ориентирована на многопотоковое исполнение (и эффективно из-за алгоритма без блоков, используемого внизу). Ориентированный на многопотоковое исполнение подразумевает , что количество параллельных доступов не должно иметь любое значение (я еще не услышал о состоянии состязания, которое, как гарантируют, не произойдет ниже xyz параллельных доступов).
Кроме того - оптимальная производительность в многопоточных приложениях более сложна, чем это. Но использование реального параллельного набора не является слишком плохим запуском.