"La comprensión en profundidad de JVM" Capítulo 13 Bloqueo de hilos de proceso seguro y optimización

directorio

Capítulo 13 hilos de proceso seguro de bloqueo y optimización

13,2 thread-safe

Lo que es seguro para hilos?

Cuando varios subprocesos tienen acceso a un objeto, si no se consideran programación alternativa y ejecución en el entorno de estos hilos en tiempo de ejecución y no requiere una sincronización adicional o realizar cualquier otra operación en la persona que llama coordinación, llamando el comportamiento del objeto se puede obtener el resultado correcto, que este objeto es segura hilo.

 

código Hilo de seguridad debe tener una característica: el propio código encapsula todos los medios necesarios para garantizar la corrección (por ejemplo, la sincronización de exclusión mutua, etc.), de manera que las personas que llaman no se preocupan por multithreading cuestiones, pero no tiene por qué poseer todas las medidas adoptadas para garantizar la adecuada multihilo llamar.

 

Enhebrar el lenguaje Java Seguridad 13.2.1

Premisa: la existencia de acceso a los datos compartidos entre varios subprocesos

(Documentos de Brian Goetz presentados)

"Nivel de seguridad" thread-safe a ser ordenada por el seguimiento fuerte débil, dividida en las siguientes cinco categorías:

Inmutable, hilo de seguridad absoluta, el hilo es relativamente seguro, compatible hilo, y el hilo hostil

1. inmutable

Los objetos inmutables deben ser thread-safe. Más tarde, a causa de los objetos inmutables son creados a partir de la parte exterior, su visibilidad será nunca cambian.

1) Los datos compartido es un tipo de datos básicos. Usar la modificación final de palabras clave para asegurarse de que la definición del tiempo inmutable.

2) compartida objeto de datos, el comportamiento del objeto de garantizar que no se produce ningún cambio en su estado de trabajo.

objetos de la clase java.lang.String son inmutables, substring (), replace () método no cambia como el valor original, devolverá un objeto String a una nueva configuración.

Asegurando que el comportamiento del objeto no afecta a la forma más fácil de propio estado, con el estado de las variables de objeto se declaran final.

En Java clase inmutable, cuerdas, tipos enumerados, Long, dobles, BigInteger, BigDecimal.

 

2. seguridad hilo Absolute

"No importa qué entorno de ejecución, la persona que llama no necesita medidas adicionales de sincronización."

Java API observó en una clase de hilo de seguridad, la mayoría no son de seguridad hilo absoluta.

privado  estática Vector <Integer> vector = nuevo vector <Integer> (); 
público  estáticas  void principales (args String []) {
    mientras que ( verdadera ) {
       para ( int i = 0; i <10; i ++ ) { 
         vector.add (yo); 
      } 
      Rosca removeThread = nuevo hilo ( nueva Ejecutable () {
          público  vacío run () {
             a ( int i = 0; i <vector.size (); i ++ ) {  
              vector.remove (i);
            } 
         }
      }; 
      Enhebrar printThread = nuevo hilo ( nueva Ejecutable () {
           público  vacío run () {
              a ( int i = 0; i <vector.size (); i ++ ) { 
                System.out.println (vector.get (i)) 
             } 
          } 
      }; 
      removeThread.start (); 
      printThread.start (); 
      mientras que (Thread.activeCount ()> 20 ); 
   } 
}

get del vector (), remove (), el tamaño () están sincronizados, pero no tome las medidas apropiadas si el código de sincronización es todavía inseguro.

 

3. relativa thread-safe

Hilo de seguridad en el sentido habitual, es necesario garantizar que este objeto es una operación segura hilo separado y sin medidas de garantía adicionales, pero para las llamadas sucesivas en un orden particular, requiere el uso de medios de sincronización adicionales cuando llame para garantizar la exactitud de la llamada.

Java, la mayoría de clases de hilos de seguridad son de este tipo, tal como Vector, HashTable, Collections.synchronizedCollection () envolturas método fuera del set.

      Hilo removeThread = nuevo Thread ( nuevo Ejecutable () {
          público  void run () {
             sincronizada (vector) {
                para ( int i = 0; i <vector.size (); i ++ ) { 
                     vector.remove (i); 
               } 
            } 
         } 
      }; 
      Tema printThread = nuevo hilo ( nueva Ejecutable () {
           público  vacío run () {
              sincronizada (vector) {
                 a ( inti = 0; i <vector.size (); i ++ ) { 
                  System.out.println (vector.get (i)) 
                } 
             } 
          } 
      };

 

compatible-hilo 4.

Se refiere al objeto en sí mismo no es hilo de seguridad, se puede utilizar para asegurar medios de sincronización objetos se pueden utilizar en un entorno seguro en el caso de llamadas simultáneas.

Se suele decir que una clase no es seguro para subprocesos, se refiere a esta situación. Tal como ArrayList y HashMap.

 

El hilo-hostil

Se refiere al extremo con independencia de que se utilicen medidas síncronas para garantizar que el objeto no puede ser utilizado con seguridad en un entorno multiproceso.

Ejemplos: método de método de clase Thread () y resume () suspenden. Dos hilos simultáneamente por un objeto hilo, una llamada a suspender (), una llamada para reanudar (), puede conducir a un punto muerto. Por esta razón, estos dos métodos son

JDK declaró @Deprecated.

 

aplicación 13.2.2 seguro para subprocesos

Cómo implementar un hilo de seguridad?

La sincronización se refiere a una pluralidad de hilos simultáneamente datos de acceso compartido, los datos compartidos para asegurar que sólo un hilo (o algunos, usando semáforo) para su uso.

sincronización 1. mutex

Mutex es un medio de sincronización, la aplicación tiene

1) palabra clave sincronizada

Después de la compilación, la formación de las instrucciones MonitorEnter y MonitorExit antes y después del bloque de código de sincronización de dos bytes.

En la especificación JVM, cuando se ejecuta la instrucción MonitorEnter, primeros intentos de obtener un objeto de bloqueo. Si el objeto no está bloqueado, o sólo la corriente de bloqueo objeto hilo, el recuento de bloqueo se incrementa.

MonitorExit instrucción ejecutada cuando el contador de bloqueo se disminuye en 1 cuando el contador llega a 0, el bloqueo se libera. Si el bloqueo del blanco de adquisición falla, el subproceso actual está bloqueado en espera.

 

2) ReentrantLock paquete java.util.concurrent bloqueo reentrante

En comparación sincronizada, ReentrantLock tiene algunas características avanzadas: espera interrumpible, cerraduras justas, cerradura puede ser unido a una serie de condiciones.

Interrumpible de espera: el hilo que mantiene el bloqueo durante mucho tiempo no para liberar el bloqueo, la rosca a la espera de la cerradura se puede renunciar a la espera, hacer otras cosas

cerradura justo: sincronizada bloqueo no justo, por defecto ReentrantLock es injusto, pero puede ser un bloqueo ReentrantLock justo

La unión puede bloquear múltiples condiciones: Condición una pluralidad de objetos puede ser ReentrantLock unido

 

sincronización 2. no bloqueante

sincronización objeto mutex será principal problema es que los bloques de problemas de rosca de rendimiento y el hilo se despierta trajo esta sincronización a la sincronización de bloques.

sincronización de exclusión mutua para la estrategia de bloqueo pesimista, la tarea no es medidas correctas de sincronización, no habrá problemas, independientemente de si existe una competencia para compartir datos, que va a bloquear.

Con el desarrollo del conjunto de instrucciones de hardware, puede utilizar la estrategia de bloqueo optimista, que es llevar a cabo una operación, si no existe contención hilo, la operación tendrá éxito, y si hay una competencia hilo, se realicen reintentos hasta que tenga éxito.

 

CAS

Cuál es la orden CAS?

ortografía CAS como comparar e intercambiar, comparar e intercambio.

CAS es el comando de la CPU (hardware relacionado), que tiene tres operandos, es decir, la dirección de memoria, el valor antiguo A, el nuevo valor de N.

Cuando se ejecuta la instrucción CAS, sólo si y cuando el valor del valor antiguo de la dirección de memoria A se actualiza con el nuevo valor de N. Sea o no la actualización tiene éxito, se devolverá el valor antiguo.

EAP incluye un conflicto de instrucciones valor de detección de actualización +, requiere múltiples operaciones semánticamente, es necesario para garantizar la atomicidad del hardware mediante una instrucción del procesador.

 

Java en el CAS.

Varios métodos son sun.misc.Unsafe inferior clase dentro compareAndSwapInt, compareAndSwapLong similares,

De este procesamiento de la máquina virtual, compilado por la instrucción CAS es un dependiente de la plataforma.

 

CAS vulnerabilidades lógicas: problema ABA

El valor anterior es cambiada por la memoria A B y luego cambiado a A, pero la memoria de valores equivocados CAS no se ha modificado.

java.util.concurrent proporciona una AtomicStampedReference para resolver este problema, el principio de la variable lleva el número de versión (A1 -> B2 -> A3).

Esta clase es relativamente insípido, ABA problema no afecta a la exactitud de la concurrencia en la mayoría de los casos.

 

3. esquema de sincronización n

El método no implica el intercambio de datos, natural no requiere ninguna medida para asegurar la precisión de la sincronización, tal código es inherentemente seguro para subprocesos

1) código reentrante

El análisis de código reentrante principio: Si un método, los mismos datos de entrada, siempre devuelve el mismo resultado.

 

2) almacenamiento local de subprocesos

Código compartido de datos se realiza en el mismo hilo, la gama visible datos compartidos se limita dentro del mismo hilo

implementa la clase en Java ThreadLocal almacenamiento local de subprocesos.

Ejemplo: El clásico web modelo de interacción, una petición corresponde a un servidor de hilo, el servidor puede utilizar almacenamiento local de subprocesos hilo de seguridad dirección

 

13.3 optimización de bloqueo

Con el fin de compartir datos de manera más eficiente entre los hilos, y las cuestiones de competencia determinación, técnicas de optimización de JVM para lograr una variedad de cerraduras.

Incluyendo bloqueos de giro, la eliminación cerraduras, engrosamiento de bloqueo, bloqueo de peso ligero, bloqueo parcial.

1. adaptativo giro bloqueo de bucle

spinlocks

antecedentes:

se logra bloqueada 1) exclusiva de mayor impacto en el rendimiento sincronizado (suspender y reanudar el hilo de rosca de las necesidades en modo kernel para completar).

2) Al mismo tiempo, en muchas aplicaciones, cuando el acceso a los datos compartidos, el hilo que mantiene el bloqueo sólo durará un período corto de tiempo. Para este tiempo muy corto para suspender y reanudar el hilo es muy valioso.

Principio: procesadores de múltiples núcleos, dos o más hilos pueden ser ejecutadas en paralelo, lo que permite la solicitud de ejecución del hilo de un bucle de bloqueo de ocupado (spin) Espera un minuto, no se dé hasta el tiempo de ejecución de procesador para ver si el hilo que mantiene el bloqueo pronto vamos a liberar el bloqueo.

Ventajas: debido a hilar un hilo a la espera de la cerradura y el proceso no causar un cambio de contexto, y por lo tanto más eficiente;

Contras: la vuelta del hilo ha estado esperando la ejecución del proceso de la ocupación de la CPU, pero no maneja cualquier tarea, por lo que si el proceso es demasiado largo, causará una pérdida de recursos de la CPU.

 

Las cerraduras de vuelta adaptativos

Principio: Adaptativo espín-espín convencional puede ser empíricamente tiempo de espera, calcular una razonable La latencia giro.

Si un bloqueo en el mismo objeto spin-espera sólo ganó con éxito las cerraduras, y el hilo que mantiene el bloqueo está en funcionamiento, lo virtual piensan que esto es probable que la vuelta de nuevo con éxito, permitirá el giro a esperar más tiempo, tal como 100 ciclos.

Si por una cerradura, giro rara vez tienen éxito también, después de la adquisición de la cerradura puede omitirse cuando el proceso de escisión, para evitar el desperdicio de recursos.

 

2. Eliminación de bloqueo

Bloqueo significa la eliminación inmediata de compilación en tiempo de ejecución, aunque una parte del código se detecta requisitos de sincronización, pero no puede haber ninguna competencia para compartir datos, lo que eliminará el código de bloqueo.

Bloqueo de eliminar el juez principal basado en el análisis de escape, si se juzga en una pieza de código, los datos no se escape fuera del montón por otros hilos acceso a, piensan que son hilos privada, sin la necesidad de bloqueo de sincronización.

 

3. 锁 粗 de

engrosamiento de bloqueo se refiere a la máquina virtual detecta se repiten una serie de operaciones para la misma cerradura objeto, de desbloqueo (incluso si no contención hilo, la sincronización de frecuencia mutuamente excluyentes causa pérdida de rendimiento innecesaria), el bloqueo se extenderá a toda la gama de funcionamiento síncrono secuencia externa.

 

4. extensión de bloqueo

existe jdk1.6 versión posterior en el trato con el concepto de sincronización de la extensión de bloqueo de bloqueo, JVM para el procesamiento de bloqueo de sincronización está sesgada de bloqueo desde el principio, con el enfoque cada vez más competitivo de actualización ligera de bloqueo bloqueo parcial, la actualización final para el bloqueo de peso pesado.

La información de bloqueo antes de la existencia de objetos Java.

 

Java objeto de formulario después de dos cabezas (JVM con el Ejemplo 32)

Tipo no-array objetos.

En donde, Mark Word o información del objeto de bloqueo código hash almacenado, Klass Palabra almacena un puntero a un objeto de datos de tipo.

El objeto es un tipo de matriz.

Para tipos de matriz, longitud de la matriz de la longitud de la matriz de memoria.

 

Durante la operación, los datos almacenados en la marca de la palabra va a cambiar el indicador de bloqueo se cambia.

1) de bloqueo sesgado

"El sesgo es un bloqueo para medios de bloqueo para optimizar el funcionamiento de su idea central es: Si un hilo para conseguir el bloqueo, y la cerradura para entrar en el modo de polarización cuando el hilo se solicite de nuevo a un bloqueo, por lo que no hay necesidad de hacer cualquier operación de sincronización. se ahorra mucho sobre el funcionamiento de la aplicación de bloqueo, lo que mejora el rendimiento de la aplicación. por lo tanto, para los más pequeños ocasiones contención de bloqueo, tienden a tener resultados mejores cerraduras de optimización, ya que muchas veces en una fila es muy probable que la misma petición con un sellador de tornillos y más feroz competencia para bloquear la ocasión, el efecto es pobre, porque en una situación competitiva, el escenario más probable es que cada vez que un subproceso diferente para solicitar la misma cerradura. tales modelos tienden a fallar, lo que también podría sesgada de bloqueo no está activado ".

 

Cuando un hilo de bloquear el acceso de sincronización se graba en el ID del tema en la cabecera del objeto marca de la palabra.

Más tarde, cuando entrar y salir del bloque sincronizado de nuevo, sin el uso de CAS para el bloqueo y el desbloqueo, sólo la cabeza marca de la palabra objeto de prueba en si está sesgada de bloqueo y ID del tema es su propio ID.

1) Si la prueba es satisfactoria (como bloqueo parcial e ID del tema de su propia), lo que indica que el mensaje ha recibido cerradura.

2) Si la prueba falla

Si Markd palabra en la bandera de bloqueo parcial se establece en 1 (es decir, de bloqueo, la corriente está sesgada), CAS tratará de usar el ID del tema marca de la palabra se establece en cuenta.

Si la corriente no está sesgada bloqueo mediante la contención de bloqueo CAS.

 

2) Bloqueo Ligera

cerradura de bloqueo de peso ligero:

Antes de realizar el bloque de sincronización, ya que la JVM crea un espacio para el almacenamiento de las cerraduras, y registro de cabecera de marca de la palabra objeto copiado para que encaje en el marco de pila hilo actual.

A continuación, tratar de sustituir una cabecera objeto marca de puntero palabra a punto de las cerraduras utilizadas CAS.

Si tiene éxito, el subproceso actual para adquirir la cerradura, si falla, otros hilos en la competición representa la cerradura, el subproceso actual intenta utilizar centrifugado para obtener el bloqueo.

 

Ligera bloqueo y desbloqueo:

Cuando está desbloqueado, el bloqueo se intente sustituir la parte de atrás de información Marcos palabra registro a utilizar CAS.

Si tiene éxito, significa que hay no se produzca competencia; si no, lo que indica la presencia actual de contención de bloqueo, bloqueo de la cerradura se expande peso pesado (bloqueo es el tradicional bloqueo mutex peso pesado).

 

A favor de cerraduras, bloquear la cerradura de peso ligero, el peso pesado

bloqueo sesgada

Papel: eliminar sesgada bloqueo primitivas de sincronización en una situación no competitiva, para mejorar aún más el desempeño del programa.

Ventajas: sesgada de sincronización de bloqueo se pueden mejorar, pero no hay rendimiento del proceso competitivo. Pero si el objeto de bloqueo es a menudo compiten múltiples hilos, que tienden a bloquear superfluo.

escena aplicable sólo para una rosca de acceso bloque de sincronización de escenas.

A favor de la cerradura de bloqueo de peso ligero

Diferencia 1) y la cerradura Ligera: cerraduras ligeros se utilizan en caso de funcionamiento libre de contención de CAS lugar de utilizar el mutex, consiguiendo de esta manera la sincronización; sesgado de bloqueo está completamente abolida en ausencia de caso síncrono competencia.

2) el mismo punto cerraduras ligeros: son el bloqueo optimista, que no creo que ningún otro hilo de contención de bloqueo durante la sincronización.

 

cerradura de peso ligero

Antecedentes: "Ligera Lock" es relativa a la "Bloqueo de peso pesado", y es el tradicional bloqueo de la cerradura de peso pesado.

Esencia: El uso de CAS para reemplazar la sincronización mutuamente excluyentes.

Pros: El hilo no bloquea la competencia, mejorar la velocidad de respuesta del programa.

Contras: Hilos de competidores aún no puede obtener un bloqueo, utilizando giro consumirá CPU

Ligera y pesada comparación bloqueo bloqueos:

1) Bloqueo pesimista peso pesado es un bloqueo, siempre se considera un número de hilos a la contención de bloqueo, por lo que cada vez que el procesamiento de los datos compartidos, independientemente de que el sistema actual es realmente un bloqueo de rosca en la competición, que será de uso exclusivo sincronización para asegurar el hilo de seguridad;

2) El bloqueo es un bloqueo ligero optimismo, que las cerraduras piensan que la probabilidad de la existencia de competencia es relativamente pequeño, por lo que no utiliza una sincronización de exclusión mutua, pero el uso de la operación del CAS para adquirir el bloqueo, lo que podría reducir el "uso exclusivo de sincronización mutex "llevar sobrecarga de rendimiento.


cerradura de peso pesado

Ventajas: la competencia no utiliza hilar, no consumen CPU

Desventajas: hilo está bloqueado, el tiempo de respuesta lento

 

Supongo que te gusta

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