Si está hablando sobre el uso de un mecanismo de bloqueo (o incluso barreras de sincronización) solo use un java.util.concurrent.Lock
. La sugerencia obvia es utilizar el ReentrantLock
que delega a Synch
. La sincronización es un AQS que a su vez usa LockSupport
.
Todo está hecho debajo de las fundas para usted.
Editar:
No vamos a ir a través de los usos prácticos de AbstractQueuedSynchronizer
(AQS).
Sin embargo, las construcciones simultáneas pueden ser muy diferentes en su uso, todas pueden tener las mismas funciones subyacentes.
I.e. Bajo alguna condición, estacione este hilo. Bajo alguna otra condición, despierta un subproceso.
Este es un conjunto de instrucciones muy amplio, pero hace que sea obvio que la mayoría de las estructuras de concurrencia necesitarían alguna funcionalidad común que les permitiera manejar esas operaciones. Ingrese AQS. Hay cinco barreras principales de sincronización.
ReentrantLock
ReadLock
WriteLock
Semaphore
CountDownLatch
Ahora, todas estas cinco estructuras tienen muy diferente conjunto de reglas al utilizarlos. Un CountdownLatch
puede permitir que muchos subprocesos se ejecuten al mismo tiempo pero obliga a uno (o más) subprocesos a esperar hasta que al menos n subprocesos cuenten hacia abajo en dicho enganche.
ReentrantLock
fuerza solo un hilo a la vez para ingresar a una sección crítica y poner en cola todos los demás hilos para esperar a que se complete.
ReadLock
permite cualquier cantidad de hilos de lectura en la sección crítica hasta que se obtenga un bloqueo de escritura.
Los ejemplos pueden continuar, pero el panorama general aquí es que todos usan AQS. Esto se debe a que pueden usar las funciones primitivas que AQS ofrece e implementa una funcionalidad más compleja en la parte superior. AQS le permite estacionar subprocesos de desconexión y desconexión (de forma interrumpible si es necesario) pero de forma que pueda admitir muchas funciones complejas.
W.: Vi LockSupport se utiliza en 'AbstractQueuedLongSynchronizer', lo que sugiere que es una especie de clase API interna? Solo quería ver un fragmento de código ilustrativo ... – Max
@Max LockSupport es una clase de utilidad que cualquiera puede usar. No es necesariamente una clase interna. Unsafe.java es un buen ejemplo de una clase interna. LockSupport es público para que otros puedan escribir su propia versión de AQS –
W.: Gracias John, sé que es para la extensión. Tu respuesta me hizo reformular una pregunta: en general, el uso de 'AbstractQueuedSynchronizer' me parece impreciso. – Max