/*
 * Copyright (c) 2011, 2019 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0, which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * This Source Code may also be made available under the following Secondary
 * Licenses when the conditions for such availability set forth in the
 * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
 * version 2 with the GNU Classpath Exception, which is available at
 * https://www.gnu.org/software/classpath/license.html.
 *
 * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
 */

package org.glassfish.jersey.internal.util.collection;

import java.util.Map;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.LinkedTransferQueue;

Utility class, which tries to pickup the best collection implementation depending on running environment.
Author:Gustav Trede, Marek Potociar
Since:2.3
/** * Utility class, which tries to pickup the best collection implementation depending * on running environment. * * @author Gustav Trede * @author Marek Potociar * @since 2.3 */
public final class DataStructures {
Default concurrency level calculated based on the number of available CPUs.
/** * Default concurrency level calculated based on the number of available CPUs. */
public static final int DEFAULT_CONCURENCY_LEVEL = ceilingNextPowerOfTwo(Runtime.getRuntime().availableProcessors()); private static int ceilingNextPowerOfTwo(final int x) { // Hacker's Delight, Chapter 3, Harry S. Warren Jr. return 1 << (Integer.SIZE - Integer.numberOfLeadingZeros(x - 1)); }
Create an instance of a BlockingQueue that is based on LinkedTransferQueue implementation, available in JDK 7 and above.

Originally, the method was used to provide backwards compatibility for JDK versions 6 and below. As those versions are now unsupported, callers should instantiate an LinkedTransferQueue directly instead of using this method.

Type parameters:
  • <E> – the type of elements held in the queue.
Returns:new instance of a BlockingQueue that is based on LinkedTransferQueue implementation from JDK 7.
/** * Create an instance of a {@link BlockingQueue} that is based on * {@code LinkedTransferQueue} implementation, available in JDK 7 and above. * <p> * Originally, the method was used to provide backwards compatibility for JDK versions 6 and below. * As those versions are now unsupported, callers should instantiate an {@link LinkedTransferQueue} * directly instead of using this method. * </p> * * @param <E> the type of elements held in the queue. * @return new instance of a {@link BlockingQueue} that is based on {@code LinkedTransferQueue} * implementation from JDK 7. */
@Deprecated public static <E> BlockingQueue<E> createLinkedTransferQueue() { return new LinkedTransferQueue<>(); }
Creates a new, empty map with a default initial capacity (16), load factor (0.75) and concurrencyLevel (16).

The method was originally used to provide the ConcurrentHashMapV8, available in JDK 8 and above, for JDK 7 or earlier. As those versions are now unsupported, callers should instantiate an ConcurrentHashMap directly instead of using this method.

Returns:the map.
/** * Creates a new, empty map with a default initial capacity (16), * load factor (0.75) and concurrencyLevel (16). * <p> * The method was originally used to provide the * <a href="http://gee.cs.oswego.edu/dl/jsr166/dist/jsr166edocs/jsr166e/ConcurrentHashMapV8.html"> * {@code ConcurrentHashMapV8}</a>, available in JDK 8 and above, for JDK 7 or earlier. * As those versions are now unsupported, callers should instantiate an {@link ConcurrentHashMap} * directly instead of using this method. * </p> * * @return the map. */
@Deprecated public static <K, V> ConcurrentMap<K, V> createConcurrentMap() { return new ConcurrentHashMap<>(); }
Creates a new map with the same mappings as the given map.

The method was originally used to provide the ConcurrentHashMapV8, available in JDK 8 and above, for JDK 7 or earlier. As those versions are now unsupported, callers should instantiate an ConcurrentHashMap directly instead of using this method.

Params:
  • map – the map.
/** * Creates a new map with the same mappings as the given map. * <p> * The method was originally used to provide the * <a href="http://gee.cs.oswego.edu/dl/jsr166/dist/jsr166edocs/jsr166e/ConcurrentHashMapV8.html"> * {@code ConcurrentHashMapV8}</a>, available in JDK 8 and above, for JDK 7 or earlier. * As those versions are now unsupported, callers should instantiate an {@link ConcurrentHashMap} * directly instead of using this method. * </p> * * @param map the map. */
@Deprecated public static <K, V> ConcurrentMap<K, V> createConcurrentMap( final Map<? extends K, ? extends V> map) { return new ConcurrentHashMap<>(map); }
Creates a new, empty map with an initial table size accommodating the specified number of elements without the need to dynamically resize.

The method was originally used to provide the ConcurrentHashMapV8, available in JDK 8 and above, for JDK 7 or earlier. As those versions are now unsupported, callers should instantiate an ConcurrentHashMap directly instead of using this method.

Params:
  • initialCapacity – The implementation performs internal sizing to accommodate this many elements.
Throws:
/** * Creates a new, empty map with an initial table size accommodating the specified * number of elements without the need to dynamically resize. * <p> * The method was originally used to provide the * <a href="http://gee.cs.oswego.edu/dl/jsr166/dist/jsr166edocs/jsr166e/ConcurrentHashMapV8.html"> * {@code ConcurrentHashMapV8}</a>, available in JDK 8 and above, for JDK 7 or earlier. * As those versions are now unsupported, callers should instantiate an {@link ConcurrentHashMap} * directly instead of using this method. * </p> * * @param initialCapacity The implementation performs internal * sizing to accommodate this many elements. * @throws IllegalArgumentException if the initial capacity of * elements is negative. */
@Deprecated public static <K, V> ConcurrentMap<K, V> createConcurrentMap( final int initialCapacity) { return new ConcurrentHashMap<>(initialCapacity); }
Creates a new, empty map with an initial table size based on the given number of elements (initialCapacity), table density (loadFactor), and number of concurrently updating threads (concurrencyLevel).

The method was originally used to provide the ConcurrentHashMapV8, available in JDK 8 and above, for JDK 7 or earlier. As those versions are now unsupported, callers should instantiate an ConcurrentHashMap directly instead of using this method.

Params:
  • initialCapacity – the initial capacity. The implementation performs internal sizing to accommodate this many elements, given the specified load factor.
  • loadFactor – the load factor (table density) for establishing the initial table size.
  • concurrencyLevel – the estimated number of concurrently updating threads. The implementation may use this value as a sizing hint.
Throws:
  • IllegalArgumentException – if the initial capacity is negative or the load factor or concurrencyLevel are not positive.
/** * Creates a new, empty map with an initial table size based on the given number of elements * ({@code initialCapacity}), table density ({@code loadFactor}), and number of concurrently * updating threads ({@code concurrencyLevel}). * <p> * The method was originally used to provide the * <a href="http://gee.cs.oswego.edu/dl/jsr166/dist/jsr166edocs/jsr166e/ConcurrentHashMapV8.html"> * {@code ConcurrentHashMapV8}</a>, available in JDK 8 and above, for JDK 7 or earlier. * As those versions are now unsupported, callers should instantiate an {@link ConcurrentHashMap} * directly instead of using this method. * </p> * * @param initialCapacity the initial capacity. The implementation * performs internal sizing to accommodate this many elements, * given the specified load factor. * @param loadFactor the load factor (table density) for * establishing the initial table size. * @param concurrencyLevel the estimated number of concurrently * updating threads. The implementation may use this value as * a sizing hint. * @throws IllegalArgumentException if the initial capacity is * negative or the load factor or concurrencyLevel are * not positive. */
@Deprecated public static <K, V> ConcurrentMap<K, V> createConcurrentMap( final int initialCapacity, final float loadFactor, final int concurrencyLevel) { return new ConcurrentHashMap<>(initialCapacity, loadFactor, concurrencyLevel); } }