Beruflich Dokumente
Kultur Dokumente
Ted Neward es el director de Neward & Associates, donde hace consultora, es mentor, ensea y hace presentaciones sobre Java,
.NET, XML Services y otras plataformas. Vive en Seattle, Washington.
08-10-2012
Las Colecciones Concurrentes fueron una enorme adicin Acerca de esta serie
As que usted considera que sabe
a Java 5, pero muchos desarrolladores Java les
acerca de programacin Java? El
perdieron de vista con toda la algaraba acerca de hecho es que la mayora de los
anotaciones y genricos. Adicionalmente (y tal vez con desarrolladores rasguan la
mayor sinceridad), muchos desarrolladores evitan este superficie de la plataforma Java,
aprendiendo apenas lo necesario
paquete porque asumen que, tal como los problemas que
para realizar su trabajo. En
pretende resolver, debe ser complicado. estaserie, Ted Neward profundiza
De hecho, java.util.concurrent contiene muchas hacia el ncleo de la funcionalidad
de la plataforma Java para
clases que resuelven efectivamente muchos problemas
descubrir datos poco conocidos que
comunes de concurrencia, sin requerir que usted siquiera pueden ayudarle a resolver incluso
sude una gota. Contine leyendo para conocer cmo las los desafos de programacin ms
clases java.util.concurrent como complicados.
1. TimeUnit
Aunque no es una clase Collections per se, la Desarrolle habilidades de este
enumeracinjava.util.concurrent.TimeUnit hace tema
Este contenido es parte de
que el cdigo sea mucho ms fcil de leer. knowledge paths progresivo para
UtilizarTimeUnit libera a los desarrolladores que usan su avanzar en sus habilidades. Vea:
mtodo o API de la tirana del milisegundo. Convirtase en desarrollador Java
Concurrencia Java
TimeUnit incorpora todas las unidades de tiempo,
variando desde MILLISECONDS y MICROSECONDS hasta
https://www.ibm.com/developerworks/ssa/java/library/j-5things4/ 17/05/2017
5 cosas que usted no saba acerca de... java.util.concurrent, Parte 1 Pgina 2 de 7
DAYS y HOURS, lo cual significa que maneja casi todos rangos de tiempo que un
desarrollador puede necesitar. Y, gracias a los mtodos de conversin declarados en la
enumeracin, incluso es trivial convertir HOURS enMILLISECONDS cuando el tiempo se
acelera.
2. CopyOnWriteArrayList
Crear una copia fresca de un array es una operacin demasiado costosa, en trminos
tanto de tiempo como de sobrecosto de memoria, como para considerarla para uso
ordinario; en su lugar, los desarrolladores a menudo usan como recurso ArrayList . Sin
embargo, esa tambin es una opcin costosa, porque cada vez que usted itera en el
contenido de la coleccin, debe sincronizar todas las operaciones, incluyendo lectura y
escritura, para garantizar la consistencia.
3. BlockingQueue
La interfaz BlockingQueue establece que es una Queue, Lo cual significa que sus
elementos se almacenan en un pedido tipo primero en entrar, primero en salir (FIFO). Los
elementos insertados en un pedido en particular son recuperados en ese mismo pedido
pero con la garanta adicional de que cualquier intento de recuperar un elemento de una
cola vaca bloquear la hebra de llamada hasta que el elemento est listo para ser
recuperado. De igual forma, cualquier intento de insertar un elemento dentro de una cola
que est llena bloquear la hebra de llamada hasta que haya espacio disponible en el
almacenamiento de la cola.
https://www.ibm.com/developerworks/ssa/java/library/j-5things4/ 17/05/2017
5 cosas que usted no saba acerca de... java.util.concurrent, Parte 1 Pgina 3 de 7
buen ejemplo. Esta construye un almacenamiento intermedio vinculado de ranura
individual usando sincronizacin manual y wait()/notifyAll() para sealar entre
hebras cuando haya un nuevo elemento disponible para consumo, y cuando la ranura est
lista para ser llenada con un nuevo elemento. (Vea la seccin implementacin de Guarded
Blocks para ms detalles).
A pesar del hecho de que el cdigo del tutorial de Guarded Blocks funciona, este es
extenso, desordenado y no es del todo intuitivo. Regresando a los primeros das de la
plataforma Java, s, los desarrolladores Java tenan que enredarse con dicho cdigo, pero
estamos en el 2010 seguramente las cosas han mejorado?
El Listado 1 muestra una versin reescrita de cdigo Guarded Blocks donde he empleado
ArrayBlockingQueue en lugar del manualmente escrito Drop.
Listado 1. BlockingQueue
import java.util.*;
import java.util.concurrent.*;
class Producer
implements Runnable
{
private BlockingQueue<String> drop;
List<String> messages = Arrays.asList(
"Mares eat oats",
"Does eat oats",
"Little lambs eat ivy",
"Wouldn't you eat ivy too?");
class Consumer
implements Runnable
{
private BlockingQueue<String> drop;
public Consumer(BlockingQueue<String> d) { this.drop = d; }
https://www.ibm.com/developerworks/ssa/java/library/j-5things4/ 17/05/2017
5 cosas que usted no saba acerca de... java.util.concurrent, Parte 1 Pgina 4 de 7
salir. La alternativa sera una poltica ms eficiente que corra el riesgo de privar de
recursos a algunas hebras. (Esto es, sera ms eficiente permitir a los lectores ejecutarse
mientras otros lectores mantienen el bloqueo, pero usted se arriesga a un flujo constante
de hebras de lectura evitando que el grabador realice su trabajo).
BlockingQueue tambin soporta mtodos que toman un Cuidado con los errores!
Por cierto, usted est en lo cierto si
parmetro de tiempo que indica cunto tiempo debe
not que Guarded Blocks contiene
bloquearse la hebra antes de retornar a la falla de seal un error enorme qu pasara si
para insertar o recuperar el elemento en cuestin. Hacer un desarrollador sincroniza en la
esto evita una espera desvinculada, la cual podra ser la instancia Drop dentro de main()?
4. ConcurrentMap
Map aloja un error sutil de concurrencia que ha llevado a muchos desarrolladores Java
incautos a perderse. ConcurrentMap es la solucin fcil.
Si dos hebras llaman un mtodo exactamente al mismo tiempo, cada una realizar prueba
y cada una realizar put, perdindose en el proceso el valor de la primera hebra.
Afortunadamente, la interfaz ConcurrentMap soporta cierto nmero de mtodos
adicionales que estn diseados para hacer dos cosas bajo un bloqueo individual:
putIfAbsent(), por ejemplo, realiza la primera prueba y luego realiza un put solo si la
clave no est almacenada en el Map.
5. SynchronousQueues
SynchronousQueue es una criatura interesante, segn el Javadoc:
Es una cola de bloqueo en la cual cada operacin de insercin debe esperar por una
operacin de eliminacin correspondiente de otra hebra y viceversa. Una cola sincronizada
no tiene ninguna capacidad interna, ni siquiera la capacidad de una.
Esencialmente, SynchronousQueue es otra implementacin de la anteriormente
mencionada BlockingQueue. Esta nos proporciona una forma extremadamente ligera de
https://www.ibm.com/developerworks/ssa/java/library/j-5things4/ 17/05/2017
5 cosas que usted no saba acerca de... java.util.concurrent, Parte 1 Pgina 5 de 7
intercambiar elementos de una hebra a otra usando la semntica de bloqueo usada
porArrayBlockingQueue. En el Listado 2, reescrib el cdigo del Listado 1 usando
SynchronousQueue en lugar de ArrayBlockingQueue:
Listado 2. SynchronousQueue
import java.util.*;
import java.util.concurrent.*;
class Producer
implements Runnable
{
private BlockingQueue<String> drop;
List<String> messages = Arrays.asList(
"Mares eat oats",
"Does eat oats",
"Little lambs eat ivy",
"Wouldn't you eat ivy too?");
class Consumer
implements Runnable
{
private BlockingQueue<String> drop;
public Consumer(BlockingQueue<String> d) { this.drop = d; }
En conclusin
https://www.ibm.com/developerworks/ssa/java/library/j-5things4/ 17/05/2017
5 cosas que usted no saba acerca de... java.util.concurrent, Parte 1 Pgina 6 de 7
Por qu luchar introduciendo concurrencia en sus clases Collections cuando la biblioteca
de tiempo de ejecucin Java ofrece equivalentes tiles y pre elaborados? El siguiente
artculo de esta serie explora an ms el java.util.concurrent namespace.
Descargar
Descripcin Nombre tamao
Comentar
https://www.ibm.com/developerworks/ssa/java/library/j-5things4/ 17/05/2017
5 cosas que usted no saba acerca de... java.util.concurrent, Parte 1 Pgina 7 de 7
Participe en la Comunidad My developerWorks.
https://www.ibm.com/developerworks/ssa/java/library/j-5things4/ 17/05/2017