2010-05-03 12 views
12

lectura Java's ConcurrentLinkedQueue Docs, me pregunto por qué no es posible para la aplicación para almacenar el tamaño:tamaño de ConcurrentLinkedQueue

Mira que, a diferencia de la mayoría de las colecciones, el método tamaño no es una operación de tiempo constante. Debido a la naturaleza asíncrona de estas colas, determinar el número actual de elementos requiere un recorrido de los elementos.

¿Dónde en the source es esta "naturaleza asincrónica"? Solo veo un ciclo while para reintentar enquear hasta que AtomicReferences coincida con los valores/referencias esperadas. ¿Por qué no es posible incrementar un size:AtomicInteger después de ofrecer con éxito un valor a la cola?

Muchas gracias.

Respuesta

5

Imagine que tiene dos hilos, uno que agrega un nuevo elemento y el otro que elimina un elemento. No hay elementos en la cola al comienzo.

Supongamos que el primer hilo añade el artículo, seguido inmediatamente por el otro hilo retirada del elemento y decrementar el tamaño, en cuyo punto su tamaño es a -1, entonces el primer hilo incrementa el tamaño a 0.

Un ejemplo ligeramente artificial, pero necesitaría hacer toda la operación atómica para asegurar que ningún otro subproceso tenga acceso al tamaño de -1.

+0

OK Entiendo que el orden en que se ejecutan los decrementos/incrementos no es determinista. Pero debería ser suficiente que un contador obtenga el tamaño aproximado de cola, ¿no es así? – hotzen

+0

Finbarr, si la cola está administrando su propio tamaño, seguramente lo haría dentro de sus métodos (sincrónicos) de agregar/eliminar, ¿sí? Entonces, ¿cuándo sería el tamaño -1? – CPerkins

+0

@CPerkins: debes leer la fuente antes de responder. ConcurrentLinkedQueue es "de espera". Es seguro para subprocesos sin métodos sincronizados. – CPerkins

0

Por qué no es posible incrementar un tamaño : AtomicInteger después del éxito ofrecer un valor a la cola?

Probablemente porque esa oferta/disminución no se pudo hacer atómicamente sin afectar adversamente la concurrencia del método.

+0

Porque el contador sería un punto de sincronización para la oferta y la encuesta? Eso tiene sentido. Sin embargo, no veo ningún comportamiento "asíncrono" que impida tal Contador si es necesario. – hotzen

4

Uno de los beneficios de rendimiento importantes de ConcurrentLinkedQueue proviene del hecho de que no se preocupe por la cola cuando actualiza la cabeza, y viceversa, ¿verdad?

Esto significa básicamente que 2 hilos pueden sondear/ofrecer al mismo tiempo sin interferir (si el tamaño de la cola no era 0, eso es).

Este no era el caso si tenía un contador. Incluso si fuera un AtomicInteger que tiene buena concurrencia, aún tendrá una mayor posibilidad de fallar las operaciones de CAS porque ahora tiene este "punto caliente" que actualiza cada vez que realiza una encuesta/oferta.

No estoy del todo seguro de si los autores dicen esto cuando dicen "naturaleza asíncrona", pero creo que esta es la razón principal por la que no tienen un contador como el que sugirió.

+0

Tiene sentido, gracias. Pero realmente me pregunto qué quieren decir con la "naturaleza asíncrona" ... – hotzen

+2

@hotzen: ¿Por qué no preguntar a los autores? Estoy seguro de que te darán una respuesta. Simplemente busque "concurrency-interest" en google y publíquelo en su lista de correo. –