tipo de un "conjunto de bloqueo". ¿Cómo puedo implementar una cola de bloqueo donde se ignora agregar un miembro que ya está en el conjunto?Cola de bloqueo de Java que contiene solo elementos únicos
Respuesta
Puede anular los métodos de agregar y poner de cualquier implementación de BlockingQueue<T>
para verificar primero si el elemento ya está dentro de la cola, p.
@Override
public boolean add(T elem) {
if (contains(elem))
return true;
return super.add(elem);
}
Puede crear una nueva clase que componga una BlockingQueue, un Set y un candado. Cuando pones() pruebas contra el conjunto mientras mantienes un bloqueo que impide que se ejecute get(). Cuando obtiene(), elimina el elemento del conjunto para que pueda volver a colocarse() en el futuro.
class BlockingSet extends ArrayBlockingQueue<E> {
/*Retain all other methods except put*/
public void put(E o) throws InterruptedException {
if (!this.contains(o)){
super.put(o);
}
}
}
La implementación de 'contains' itera sobre la lista, esto sería realmente lento ... –
Una implementación cola de bloqueo respaldado por un conjunto de hash vinculados por el orden de iteración predecible y constante de tiempo Además, la eliminación y contiene operaciones:
escribí esta clase para resolver un problema similar:
/**
* Linked blocking queue with {@link #add(Object)} method, which adds only element, that is not already in the queue.
*/
public class SetBlockingQueue<T> extends LinkedBlockingQueue<T> {
private Set<T> set = Collections.newSetFromMap(new ConcurrentHashMap<>());
/**
* Add only element, that is not already enqueued.
* The method is synchronized, so that the duplicate elements can't get in during race condition.
* @param t object to put in
* @return true, if the queue was changed, false otherwise
*/
@Override
public synchronized boolean add(T t) {
if (set.contains(t)) {
return false;
} else {
set.add(t);
return super.add(t);
}
}
/**
* Takes the element from the queue.
* Note that no synchronization with {@link #add(Object)} is here, as we don't care about the element staying in the set longer needed.
* @return taken element
* @throws InterruptedException
*/
@Override
public T take() throws InterruptedException {
T t = super.take();
set.remove(t);
return t;
}
}
- 1. ¿Cómo asegurar que la lista contiene elementos únicos?
- 2. Cola concurrente y de bloqueo en Java
- 3. ¿Colección que solo permite elementos únicos en .NET?
- 4. Obtener elementos únicos de NSMutableArray
- 5. Determine programáticamente qué hilo de Java contiene un bloqueo
- 6. Sesión que contiene elementos que implementan IDisposable
- 7. ¿Hay una cola de tamaño fijo que elimine elementos excesivos?
- 8. formcollection solo contiene los valores de elementos html.listbox seleccionados? MVC
- 9. teclado cola de bloqueo interrumpible en Python
- 10. Qué cola de bloqueo de Java es más eficiente para escenarios de consumidor único de un solo productor
- 11. C# hashset Contiene no únicos objetos
- 12. ¿Hay alguna cola de bloqueo de la feria (ilimitada) en java?
- 13. El bloqueo de cola - Necesidad de más información
- 14. XPath para obtener nombres de elementos únicos
- 15. Contenedor para una pila de elementos únicos
- 16. Colecciones concurrentes y elementos únicos
- 17. Cualquier implementación de cola libre de bloqueo de un solo productor de un solo consumidor en C?
- 18. elementos únicos en una lista de haskell
- 19. Elige m elementos al azar de un vector que contiene n elementos
- 20. Cola llena, profundidad de la cola de bloqueo, se necesita aclaración
- 21. Una cola que garantiza la singularidad de los elementos?
- 22. Diccionario que contiene solo objetos serializables
- 23. creando una cola de animación en jQuery que contiene varios elementos DOM y animaciones y los dispara secuencialmente?
- 24. Java: cola de prioridad
- 25. C++ pthread bloqueo de interbloqueo de cola (creo)
- 26. ¿Cómo puedo hacer que NSMutableArray solo acepte valores únicos?
- 27. Implementación de cola de bloqueo de subprocesos en .NET
- 28. Bloqueo de archivos Java
- 29. bloqueo de subproceso Java
- 30. ¿Es esto (bloqueo) la implementación de cola Thread-Safe?
buena pero no óptima como la implementación BlockingQueue normal de contains() requiere un recorrido de toda la cola –
yo diría "óptima" es subjetivo. A menos que gane la suya, la otra opción simple es la sugerida por Spike y es una compensación clásica de espacio vs. tiempo. Entonces, si bien podría argumentarse como la mejor solución dependiendo del uso, le doy mi voto a esto debido a su simplicidad. –
si "óptimo" incluye correcto, entonces esta implementación fallaría ya que es una condición de carrera. – jtahlborn