08: Bloqueo relacionados con Java

Bloqueo: 
     bloqueo de bucle: Para determinar si se cumple una condición, el código está escrito en un bucle While. Tenemos que juzgar esta condición. 
             Con el fin de no renunciar a la CPU para realizar eventos, el reciclaje de tecnología para el CAS para tratar los datos operacionales. 
     Bloqueo pesimista: Supongamos que se produce violación de concurrencia, sincronizar todas las operaciones sobre los datos. 
     El bloqueo optimista: Supongamos que no hay conflicto, cuando los datos son modificados si nos encontramos con el número de versión no es lo mismo, y luego tratar de releer los datos cambian. 
     bloqueos exclusivos: leer y escribir los puntos de datos para desbloquear. Leer bloqueo de lectura, bloqueo de escritura está escrito. 
         bloqueo exclusivo (escritura): para añadir recursos para escribir bloqueo exclusivo. Sólo un hilo puede escribir, otros hilos pueden leer. (Escribir una vez, sólo un hilo puede adquirir el bloqueo de escritura) 
         bloqueo exclusivo (lectura): Después de añadir un bloqueo de lectura, sólo se pueden leer, no escribir (leer más, varios subprocesos pueden adquirir un bloqueo de lectura) 
     de bloqueo de reentrada: mientras el primero en recibir las llaves, se puede abrir la parte posterior de la 
     cerradura no reentrante: necesitará cada recurso para obtener una nueva clave de 
     cerraduras justas: adquirir el mecanismo de bloqueo es justo, primer hilo adquirir el bloqueo. 
     bloqueo injusto: A continuación, el hilo puede adquirir primero la cerradura. 
El concepto y la palabra clave de bloqueo sincronizado: 
    mecanismo básico de comunicación hilo basado en la aplicación de monitor objeto. Java cada objeto sobre un hilo de monitor asociado puede bloquear o desbloquear un monitor. 
    palabra clave sincronizada no sólo puede lograr la sincronización, de acuerdo con la especificación de JVM también asegura la visibilidad. (Bloqueo debe \ desbloquear la necesidad de lograr sucede - el principio antes)
    gama cerradura: cerraduras, bloqueo de objeto, bloqueo cancelación de bloqueo engrosamiento. (Estas palabras clave están en el documento: Java SE 6 se encuentran en blanco Potencia Pater.) 
    De bloqueo del objeto: 
        pública  la sincronizada  vacío del Test () {} 
    Bloqueos: 
        pública  la sincronizada  estática  vacío del Test () {} // añadir la palabra clave static 
    engrosamiento de bloqueo (JIT compilador optimización de ejecución): Dado que el código multi-segmento utiliza la misma cerradura, compilación: el bloqueo de escritura granularidad haciendo rugosa bloque de amplificación el código de sincronización, los segmentos de código que comprende.
        pública  vacío Test () {
              el sincronizada ( del este ) {} párrafo A
              la sincronizada ( del este ) {B} párrafo 
        } 
        optimizado: 
         pública  vacío Test () {
              el sincronizado ( el este ) {párrafo A, segmento B} 
         }
    operación de bloqueo es eliminar :( optimización JIT): El bloqueo se cancela. 
        Por ejemplo: StringBuilder es thread-safe, append Cada método tiene sus cerradura. puntos calientes JIT contienen append el código de bloqueo se retira. 
        (JIT sentir ningún problema de seguridad de rosca cuando se optimizará la región crítica hay competencia.) 
    El principio de bloqueo sincronizado: 
        la JVM optimizada para cerraduras experimentarán: bloqueo parcial, de peso ligero de bloqueo, bloqueo de peso pesado. 
         :( sesgado de bloqueo mecanismo de bloqueo optimizado, habilitado por defecto)
              1 : Objeto de bloqueo tiene una bandera para indicar si abrir un sesgo de bloqueo. Hay un lugar para almacenar el ID del hilo, el valor predeterminado es 0.
             2 : el hilo para determinar si se trata de si el objeto está sesgada de bloqueo, si lo es, entonces el objeto de bloqueo se determina si el ID del hilo 0, si 0: disponible, a continuación, cambiar su ID hilo.
             3 : Si sólo un hilo es, de hecho, ninguna cerradura. ID debe bloquear posición siempre ha sido un ID de hilo. 
             De hecho, el bloqueo es para determinar si el objeto es la identificación del hilo es el ID del hilo, con el fin de determinar si se utiliza el objeto de bloqueo. 
             Si varios subprocesos compiten para cerraduras contener bloqueo sesgada: la 
                 primera hilo después de rosca modificado objeto de bloqueo ID  
                 segundo hilo después de la determinación del objeto de bloquear el ID del hilo que se ha escrito: donde la competencia se produjo bloqueo.
                 esta vez en un mecanismo de bloqueo de bloqueo ligero. CAS se utiliza para determinar el mecanismo de bloqueo de la bandera objeto de bloqueo (después de un cierto giro aquí para entrar bloqueado porque consume recursos). 
        cerradura de peso ligero:
             1 : determinar un estado de una posición del objeto almacenado en el espacio de memoria, la ubicación marcada si el objeto está bloqueado. Nos referimos a que el indicador de bloqueo
             2 : Cuando un hilo llega a bloquear el objeto: CAS mecanismo para determinar el indicador de bloqueo objeto, si tiene éxito, modificar el indicador de bloqueo de objetos, información de bloqueo de la pila de almacenamiento de hilo objeto. 
            De hecho, cada hilo llegó a ser sincronizado si hay otros hilos están utilizando el bloque de código. (Bloqueo bit indicador determina el bloqueo del objeto) 
        de bloqueo de peso pesado - (bloqueo del monitor) 
            CAS n veces si el giro no ha adquirido la cerradura, la cerradura se actualizarán bloqueo de peso pesado en bloqueado. 
            también conocido como el monitor de tubo, un objeto correspondiente a un monitor. Almacenamiento de las colas de espera para el hilo. Con el fin de conseguir la espera de bloqueo, la lucha por la liberación.

 

 



Otros: 
    llamada de transacción interfaz de problemas. Y la conexión de base de datos se establece cuando se inició la transacción, si este tiempo para hacer algunas cosas molestas. Esto hace que el tiempo de conexión de base de datos es demasiado largo. 

Usar interfaz de Bloqueo: 
    Bloqueo de adquirir el bloqueo si el bloqueo ya está ocupada por otro hilo, en la espera. de espera de hilo para que el proceso se interrumpe, el error. 
    lockInterruptibly adquirir el bloqueo si la persona ya está en uso, introduzca la espera. de espera de hilo para el proceso se interrumpe, se produce una excepción, al final de la espera. 
    trylock intentar adquirir el bloqueo, volver inmediatamente a obtener o recibir menos. 
    desbloquear el bloqueo se libera 
ReentrantLock: Bloqueo de reentrada 
    exclusivos de bloqueo; apoyo cerraduras justo, justo y modo de no bloqueo. 
    Con unos pocos de este bloqueo. Tenemos que llamar varias veces desbloqueo. 
clase test0 {
     Privado  final de ReentrantLock = Bloqueo nueva nueva de ReentrantLock ();
     nula m () { 
        Lock.lock (); 
        el try { 
            X (); 
        } finally { 
            lock.unlock (); 
        }
    }
    vacío X () { 
        Lock.lock (); 
        // la lógica de ejecución TODO 
        lock.unlock (); 
    } 
} 
ReadWriteLock: bloqueo de escritura 
    mantiene dos cerraduras, bloqueos de lectura, bloqueos de escritura. 
    Leer cerraduras pueden ser accedidos por múltiples hilos, un hilo puede adquirir sólo los bloqueos de escritura. Hay un bloqueo de lectura no va a obtener un bloqueo de escritura. 
    HashTable es el uso de la palabra clave sincronizada, leer y escribir sólo un hilo puede conseguir. Si es menor de lectura y escritura es relativamente pobre, pero el hilo de seguridad. Es decir ConcurrentHashMap reemplazado. 
clase test1 {
     int i = 0 ;
     Privada  final ReentrantReadWriteLock con ReadWriteLock = nueva nueva ReentrantReadWriteLock con ();
     públicas  void main (String [] args) {
         new new Thread (() -> Read ()) Inicio () ;.
         nueva nuevo la rosca (() - >. Read ()) Inicio ();
         nuevo nuevo la rosca (() -> Write ()) Inicio () ;. 
    } 
    // cerraduras múltiples hilos pueden obtener leer 
    pública  vacío Read () { 
        readWriteLock.readLock () bloqueo (). ; 
        // leer 
        readWriteLock.readLock () de desbloqueo () ;. 
    } 
    // sólo un hilo puede obtener un bloqueo de escritura 
    pública  sin efecto la escritura) {( 
        readWriteLock.writeLock de bloqueo () () ;. 
        // escritura 
        readWriteLock.writeLock () de desbloqueo. (); 
    } 
} 
    cerradura degrade: 
        bloqueo de escritura era una rebaja bloqueo de lectura. Control sobre el bloqueo de escritura actual, al mismo tiempo, adquirir un bloqueo de lectura, a continuación, suelte el bloqueo de escritura. (Asegúrese de que los datos no pueden ser modificadas varias veces, la razón: cuando hay un bloqueo de lectura de bloqueo de escritura no será adquirida) 
        Escena: middleware de almacenamiento en caché 
              leer bloqueo en primer lugar determinar la caché, la memoria caché de la base de datos de no obtener los datos.
              Si un gran número de hilos para leer cerradura, entonces habrá una gran cantidad de hilos consultas DB. Caché avalancha. 
              Solución: liberar el bloqueo y abrir el bloqueo de escritura. Compruebe la base de datos. 
clase test2 {
     // crear un mapa de memoria caché para datos de retención. 
    Privada del mapa <String, Object> = Mapa nuevo nuevo HashMap <> ();
     // Utilice el bloqueo de reentrada de lectura y escritura 
    privada  estática ReadWriteLock RWL = nueva nueva ReentrantReadWriteLock con ();
     pública GET objeto (cadena ID) { 
        Object value = nula ;
         / / primero abrir la cerradura a buscar desde la memoria caché 
        rwl.readLock de bloqueo () () ;.
         el try {
             SI (como map.get (ID) == nula ) {
                 // debe liberar el bloqueo de lectura
                rwl.readLock () de desbloqueo () ;.
                 // consulta la base de datos, con el fin de evitar una gran cantidad de hilo para consultar la base de datos. Aquí utilizar un bloqueo de escritura de bloqueo (leer otros hilos son incapaces de entrar y ganar el tiempo para leer la base de datos). 
                rwl.writeLock () Bloqueo () ;.
                 el try {
                     // han múltiples hilos están bloqueados en el exterior bloqueo de lectura y escritura, con el fin de garantizar que sólo se consulta la base de datos una vez. Una vez más para determinar si hay otros hilos tienen una consulta antes. 
                    SI (como map.get (ID) == nula ) {
                         // el TODO leer base de datos. El resultado se escribe en la memoria caché de mapa. 
                    } La otra cosa { 
                        valor = como map.get (ID); 
                    } 
                    // bloqueo de escritura degradado a un bloqueo de lectura, por lo que ningún otro hilo puede modificar el valor. Garantizar la singularidad de los datos. (Cuando hay un bloqueo de adquisición menos bloqueo de lectura y escritura)
                    . Rwl.readLock () Lock ();
                } El finalmente { 
                    . Rwl.writeLock () de desbloqueo (); 
                } 
            } else { 
                valor = como map.get (ID); 
            } 
        } el fin { 
            Rwl.readLock () de desbloqueo ();. 
        } 
        Retorno valor; 
    } 
} 
para mecanismos Condition: 
    por Como alternativa a la espera / notificar 
    objeto de wait (), notify (), notify (), con el uso de sincronizada. Usted puede despertar un multi-temas. No es exactamente despertar hilo específico. 
    Lock Condición necesita ser configurado para su uso, proporcionando un conjunto de una pluralidad de espera, un control más preciso de wakeup (uso subyacente Parque / a mecanismo Unpark implementado)
    

 

 
 

 

 

 

Supongo que te gusta

Origin www.cnblogs.com/Xmingzi/p/12619768.html
Recomendado
Clasificación