Como herramienta para compartir datos simultáneamente y garantizar la coherencia, los bloqueos tienen múltiples implementaciones en la plataforma JAVA (como sincronizado y ReentrantLock, etc.). Estos candados ya escritos brindan comodidad para nuestro desarrollo, pero rara vez se mencionan la naturaleza y el tipo específicos de los candados. Esta serie de artículos analizará los nombres y características de bloqueos comunes en JAVA para responder sus preguntas.
cerradura de bloqueo
Los bloqueos de bloqueo, a diferencia de los bloqueos de giro, cambian el estado de ejecución del hilo.
En el entorno JAVA, el subproceso Thread tiene los siguientes estados:
1. Nuevo estado
2. Estado listo
3. Estado de ejecución
4. Estado bloqueado
5. Estado de muerte
Se puede decir que el bloqueo de bloqueo permite que el hilo entre en el estado de bloqueo y espere. Cuando se obtiene la señal correspondiente (despertador, hora), el hilo puede entrar en el estado listo. Todos los hilos en el estado listo entran en el estado de ejecución. a través de la competencia.
En JAVA, los métodos que pueden entrar/salir, bloquear el estado o contener bloqueos incluyen la palabra clave sincronizada (bloqueo de peso entre ellos), ReentrantLock, Object.wait()/notify(), LockSupport.park()/unpart()( juc de uso frecuente)
El siguiente es un ejemplo de un bloqueo de bloqueo JAVA:
bloqueo de paquete; importar java.util.concurrent.atomic.AtomicReferenceFieldUpdater; importar java.util.concurrent.locks.LockSupport; clase pública CLHLock1 { clase estática pública CLHNode { el hilo volátil privado está bloqueado } @SuppressWarnings ("no utilizado") CLHNode volátil privado; cola; hilo final estático privado<CLHNode> LOCAL = nuevo ThreadLocal<CLHNode>(); AtomicReferenceFieldUpdater final estático privado<CLHLock1, CLHNode> UPDATER = AtomicReferenceFieldUpdater.newUpdater(CLHLock1.class, CLHNode.class, "tail"); .set(nodo); preNode = UPDATER.getAndSet (este, nodo); if (preNode! = nulo) { preNode.isLocked = Thread.currentThread(); LockSupport.park (esto); preNode = nulo; void unlock() { CLHNode nodo = LOCAL.get(); if (!UPDATER.compareAndSet(este, nodo, nulo)) { System.out.println("desbloquear/t" + node.isLocked.getName()); LockSupport.unpark(node.isLocked) nodo = nulo;
Aquí usamos el bloqueo de bloqueo de LockSupport.unpark(). Este ejemplo es una modificación del bloqueo CLH.
La ventaja de bloquear los bloqueos es que los subprocesos bloqueados no ocuparán tiempo de CPU y no causarán una ocupación excesiva de la CPU, pero el tiempo de entrada y el tiempo de recuperación son ligeramente más lentos que los bloqueos de giro.
En el caso de una competencia feroz, el rendimiento de las cerraduras de bloqueo es significativamente mayor que el de las cerraduras giratorias.
La situación ideal es usar bloqueos de giro cuando la competencia de subprocesos no sea feroz y usar bloqueos cuando la competencia sea feroz.
(Finaliza el texto completo)