2012-03-10 20 views

Respuesta

10

¿Cuál es AbstractQueuedSynchronizer en paquete concurrent.locks utiliza para

El AbstractQueuedSynchronizer es los bloques de construcción para construcciones de sincronización que se utilizan y aplican (por lo menos) en la java.util.concurrency paquete.

Por ejemplo, ReentrantLock delega en una sincronización que extiende AbstractQueuedSynchronizer. Si se va a escribir su propio candado que podría tener este aspecto

public class MyLock extends AbstractQueuedSynchronizer implements Lock{ 
    @Override 
    public void lock() { 
     super.acquire(1); 
    } 
    @Override 
    public void unlock() { 
     if(Thread.currentThread() != super.getExclusiveOwnerThread()) 
      throw new IllegalMonitorStateException(); 
     super.release(1); 
    } 
} 

Así que aquí la clase myLock heredará la funcionalidad de bajo nivel de la suspensión de rosca & cola para el AQS durante la manipulación de cualquier misma funcionalidad especial (por ejemplo, este bloqueo requiere que el hilo que posee el bloqueo sea el que lo libera, pero un semáforo no lo hace).

Puede alguien arrojar alguna luz sobre sus métodos y doAcquireInterruptibly parkAndCheckInterrupt

Nota: Estos métodos son privadas de la clase para la funcionalidad real es capaz de cambiar entre diferentes versiones o diferentes implementaciones. La funcionalidad predeterminada proporcionada actualmente es la siguiente:

doAcquireInterruptibly Intentaré ser el propietario exclusivo de esta sincronización. Hará esto por siempre hasta que el hilo se interrumpa o adquiera con éxito. Considere un hilo tratando de entrar en un bloque synchronized, el hilo se quedará allí y esperará hasta que entre al monitor (no hay hilos actualmente o el hilo propietario es el monitor). La ventaja aquí es que el hilo de adquisición puede ser interrumpido.

parkAndCheckInterrupt Simplemente un método de conveniencia que suspenderá (estacionará) un hilo, regresará al restablecer el estado interrumpido.

+0

Aah! Gracias John ... Gran explicación – Hemanshu

+1

@Hemanshu: Si esta respuesta te ayudó, márcala como aceptada. Es un signo de gratitud para quienes lo ayudan y también una forma de guiar a otros que tienen este problema. –

6
  • AbstractQueuedSynchronizer: Proporciona un marco para la aplicación de las cerraduras de bloqueo y sincronizadores relacionados, como los semáforos, etc. CountDownLatch El algoritmo básico para adquirir es tratar de adquirir, si el retorno exitoso en otro hilo de puesta en cola, si no está ya en la cola y el bloque el hilo actual. Del mismo modo, el algoritmo básico para el lanzamiento es try release, si tiene éxito, desbloquea el primer hilo en la cola, sino simplemente devuelve. Los subprocesos esperarán en una cola de espera de primero en entrar, primero en salir (FIFO). Los métodos abstractos tryAcquire y tryRelease se implementarán por subclases según su necesidad.

  • doAcquireInterruptibly intentará adquirir el bloqueo. Si el bloqueo ya fue adquirido por otro hilo, el hilo actual será bloqueado (estacionado). Si adquiere el bloqueo, simplemente regresará.

  • parkAndCheckInterrupt aparcará el hilo o, en otras palabras, deshabilitará la programación del hilo hasta que otro hilo lo desbloquee. Puede ser debido a la liberación del bloqueo por el hilo propietario o debido a otro hilo que lo interrumpe. Si se interrumpe por algún otro hilo, se lanzará una excepción.
2

Me gustaría hablar sobre AbstractQueuedSynchronizer (AQS) con algunas palabras simples.

pensar acerca de estos escenarios en el mundo real:

  • Para los nadadores, pueden nadar juntos en una piscina (compartido ). Pero para el limpiador que lo sanitará con cloro reflexionar, él tiene que esperar hasta que todos los nadadores se hayan ido (exclusivo).
  • Para los conductores que están fuera de un estacionamiento ocupado, deben esperar en una cola. Por lo general, un portero controla el acceso. Un automóvil normal tendrá una plaza de estacionamiento. Una Lincoln Limousine puede tomar dos o más.

Como vemos, hay 3 variables:

  1. cantidad total de recursos.
  2. Cuantos recursos cada vez que toma.
  3. Estrategia de acceso (compartida/exclusiva).

AQS es una clase de plantilla utilizada para administrar la SECCIÓN CRÍTICA, lo que significa que puede extenderla y completar con las variables anteriores para finalizar su trabajo. Se han ocultado detalles sobre cómo evitar el peligro racial o controlar la cola.

Para obtener más información, será mejor que aprenda el código fuente de Mutex, Semaphore y ReentrantReadWriteLock.

Cuestiones relacionadas