Java bloqueo de cola en LinkedBlockingQueue

directorio

1.LinkedBlockingQueue Introducción

Interfaz 1.1BlockingQueue

Al igual que con ArrayBlockingQueue, LinkedBlockingQueue también logró interfaz BlockingQueue.

1.2LinkedBlockingQueue

LinkedBlockingQueue

LinkedBlockingQueue es una cola de bloqueo aplicación lista enlazada unidireccional.

LinkedBlockingQueue tamaño de la capacidad se puede especificar en el momento de la creación, para evitar la cola de la expansión excesiva. Si no se especifica la capacidad de la cola, el tamaño por defecto de la capacidad Integer.MAX_VALUE.

1.3LinkedBlockingQueue principio y Estructuras de Datos

Descripción:

(01) la cabeza de la lista es el encabezado. Al quitar los datos, se elimina de la cabecera en la cabeza, quitado de la cola.
(02) pasado en la lista es el extremo de la mesa. Cuando los nuevos datos se insertan al final de la tabla de la última enqueuing.
(03) contar el tamaño real de la lista, es decir, el número de nodos contenida en esta lista.
(04) la capacidad es la capacidad de la lista, que se especifica al crear la lista.
(05) putLock se inserta en la cerradura, se retira de bloqueo takeLock; notEmpty "condición no vacía", notFull está "bajo condiciones". Para la lista de control de concurrencia a través de ellos.

 LinkedBlockingQueue en la realización de "acceso multi-hilo exclusivo de la competencia por los recursos" para la "inserción" y "eliminar (borrar)" Las operaciones están utilizando una cerradura diferente. Para la operación de inserción, sincronizado por "Insertar bloqueo putLock"; para la operación de descarga, sincronizado por "conseguir takeLock bloqueo".

 

análisis de código fuente 2.LinkedBlockingQueue

2.1 Crear

pública LinkedBlockingQueue ( int capacidad) {
     si (capacidad <= 0) arrojar  nueva IllegalArgumentException ();
    este .La capacidad = capacidad; 
    última = cabeza = nuevo nodo <E> ( nula ); 
}
// capacidad de la cola, no se especifica la hora de crear el valor predeterminado es Integer.MAX_VALUE 
privada  final  int capacidad;
 // número de elementos en la cola 
privada  final AtomicInteger COUNT = nueva nueva AtomicInteger ();
 // cabeza de la lista (jefe de equipo) 
transitorios del Nodo <e> cabeza;
 // final de la lista (la cola) 
privada  transitoria del nodo <e> Última;
 // "condición no vacío" para el control de bloqueo "borrar elemento" y la correspondiente takeLock notEmpty 
privada  final de ReentrantLock takeLock = nueva nueva de ReentrantLock ();
 privada  final Condition notEmpty = takeLock.newCondition ();
 //Para controlar el "elemento aditivo" putLock y la cerradura correspondiente "en condiciones" notFull 
privada  finales de ReentrantLock putLock = nuevo nuevos de ReentrantLock ();
 privada  finales Condition notFull putLock.newCondition = ();
estática  clase Nodo <E> { 
    elemento E; 
    Nodo <E> siguiente; 
    Nodo (E x) {item = x; } 
}
 

2,2 método put

// put方法:若队列满, espere直到队列有空闲
pública  vacío put (E e) lanza InterruptedException {
     si (e == nula ) arrojar  nueva NullPointerException ();
    // Nota: Convenio en todas las put / toma / etc es para preestablecer var
     // sosteniendo negativo recuento para indicar fracaso a menos set. 
    int c = -1 ; 
    Nodo <E> nodo = nuevo nodo <E> (e);
    última ReentrantLock putLock = esta .putLock;
    último recuento AtomicInteger = esta .count;
  //Para obtener un bloqueo 
    putLock.lockInterruptibly ();
     el try {
     // Si la cola está llena, la corriente (productor) notFull hilo de espera bloqueada en 
        el tiempo (count.get () == Capacity) { 
            notFull.await (); 
        } 
    // elemento en equipo 
        de la puesta en cola (el nodo);
     // el "número de elementos en la cola" 1, y el retorno al "número de elementos en el original" 
        c = count.getAndIncrement ();
     // si el elemento en el equipo después de que la cola está todavía lleno, espera despertar en la rosca notFull (productor) 
        IF (C + 1 <. Capacity) 
            notFull.signal (); 
    } la finalmente {
     // cierre de liberación 
        putLock.unlock (); 
    } 
  //Si el número de cualquier elemento de la cola original es 0, entonces el elemento en el equipo, el (los consumidores) de rosca de despertador espera en notEmpty 
    SI (C == 0 ) 
        signalNotEmpty (); 
} 
privada  sin efecto la puesta en cola (el nodo <E> Nodo ) {
     // Assert putLock.isHeldByCurrentThread ();
     // Assert last.next == null; 
    Última last.next = = nodo; 
} 
privada  vacío signalNotEmpty () {
     final de ReentrantLock = takeLock la presente .takeLock; 
    takeLock.lock (); 
    el try { 
        notEmpty.signal (); 
    } finally { 
        takeLock.unlock ();  
    }
}

2.3 Forma de toma

// Tomar método: Si la cola está vacía, espera hasta que la cola no está vacía 
pública Take E () lanza InterruptedException { 
    E X; 
    int C = -1 ;
     final de AtomicInteger COUNT = el presente .count;
     final de ReentrantLock = takeLock la presente .takeLock;
   // get cerradura 
    takeLock.lockInterruptibly ();
     el try {
     // Si la cola está vacía, los actuales (consumidores) sobre el hilo bloqueado en espera notEmpty 
        el tiempo (count.get () == 0 ) { 
            notEmpty.await (); 
        } 
    // elemento cabo equipo 
        el X- = dequeue ();
     //El "número de elementos en la cola" -1, y el retorno a la "número de elementos en el original" 
        c = count.getAndDecrement ();
         // Si, después de los elementos del equipo, los elementos restantes todavía cola, a la espera en la estela de notEmpty (consumidor ) hilo 
        IF (C> 1. ) 
            notEmpty.signal (); 
    } la finalmente {
     // cierre de liberación 
        takeLock.unlock (); 
    } 
  // si la cola original es completo, el elemento después de quitar de la cola, el wakeup espera en notFull (productor) hilo 
    IF (C == Capacity) 
        signalNotFull (); 
    retorno X; 
} 
privada E dequeue () {
     // Assert takeLock.isHeldByCurrentThread ();
     // Assert head.item == null; 
    el nodo <E> H =cabeza; 
    Nodo <E> = primera h.next; 
    h.next = h; // ayuda GC 
    cabeza = primero; 
    E x = first.item; 
    first.item = nulo ;
    retorno X; 
} 
Privada  vacío signalNotFull () {
     definitiva ReentrantLock putLock = esta .putLock; 
    putLock.lock (); 
    tratar { 
        notFull.signal (); 
    } Finalmente { 
        putLock.unlock (); 
    } 
}
 

Supongo que te gusta

Origin www.cnblogs.com/yeyang/p/12580619.html
Recomendado
Clasificación