Con el desarrollo vigoroso de Internet, cada vez más compañías de Internet enfrentan problemas de seguridad concurrentes causados por la expansión del volumen del usuario. Este artículo se centra en varios mecanismos de bloqueo comunes en la concurrencia de Java.
1. Bloqueo positivo
El bloqueo sesgado es un mecanismo de optimización de bloqueo propuesto por JDK1.6. La idea central es que si el programa no compite, se cancelará la operación de sincronización de subprocesos que ha obtenido previamente el bloqueo. Es decir, si un hilo adquiere un bloqueo, entra en modo de sesgo. Cuando el hilo solicita nuevamente el bloqueo, no es necesario realizar operaciones de sincronización relevantes, ahorrando así el tiempo de operación. Si otros hilos realizan solicitudes de bloqueo en el medio, el bloqueo de bloqueo sale del modo de sesgo. Usando -xx:+UseBiasedLocking en JVM
paquete jvmproject; import java.util.list; import java.util.vector; public class sesed {public static list <integer> numberList = new Vector <Integer> (); public static void main (string [] args) {long begin = system.currentTimemillis (); int count = 0; int startnum = 0; while (Count <10000000) {numberList.Add (startnum); startnum+= 2; contar ++; } Long End = System.CurrentTimemillis (); System.out.println (final de Begin); }}Inicialice un vector, agregue 100,000,000 de objetos enteros y luego genere la diferencia de tiempo. Esto se usa para probar el rendimiento de los bloqueos sesgados. ¿En cuanto a por qué debe usar Vector en lugar de ArrayList?
Debido a que ArrayList es Insecure de subprocesos, el vector es seguro de subprocesos. Esto puede no ser lo suficientemente específico, puede ver el código fuente.
Casi todas las operaciones en el vector se sicronizan, mientras que ArrayList no lo hace, por lo que el vector es seguro de subprocesos.
A continuación, probemos cuánto impacto tienen la apertura de las cerraduras sesgadas y no la apertura de los bloqueos sesgados en el rendimiento del programa.
Configurar los parámetros de inicio JVM (encender el bloqueo de sesgo) a:
Configure los parámetros de inicio JVM (bloqueo de polarización de cierre) a:
¡Perfecto! El tiempo de ejecución del programa que habilita el bloqueo sesgado es significativamente más corto. Tiene ciertas ventajas para permitir cerraduras sesgadas que no habilitar cerraduras sesgadas. El método de sincronización para operar un objeto en un solo hilo. De hecho, también se puede entender de esta manera. Cuando solo hay un hilo que opera un objeto vectorial con un método de sincronización, la operación en el vector se convertirá en una operación en ArrayList.
El bloqueo sesgado no tiene un fuerte efecto de optimización cuando el bloqueo es competitivo, porque una gran cantidad de competencia hará que el hilo que mantenga el bloqueo cambie continuamente, y es difícil que el bloqueo permanezca en el modo sesgado. En este momento, el uso del bloqueo sesgado no solo no alcanza la optimización del rendimiento, sino que puede reducir el rendimiento del sistema. Por lo tanto, en el caso de una competencia feroz, puede intentar usarlo.
-Xx: -SebiAbiAstedLocking Parameter deshabilita el bloqueo de sesgo.
2. Localización ligera
Si el bloqueo sesgado falla, la máquina virtual Java le pedirá al hilo que solicite un bloqueo liviano. El bloqueo liviano se implementa dentro de la máquina virtual y se implementa utilizando un objeto que se convierte en un BasicObjectlock, que se compone de un objeto BasicLock y un puntero de objeto Java que contiene el bloqueo. El objeto BasicObjectLock se coloca en el marco de la pila Java. El campo Displayed_header también se mantiene dentro del objeto BasicLock, que se utiliza para hacer una copia de seguridad de la palabra de marca del encabezado del objeto.
Cuando un hilo contiene el bloqueo de un objeto, la información de palabras de marca del encabezado del objeto es la siguiente
[PTR | 00] Bloqueado
Los dos bits al final son 00, y la palabra de marca completa es un puntero al objeto BasicLock. Dado que el objeto BasicObjectLock está en la pila de subprocesos, el puntero debe apuntar al espacio de la pila de subprocesos que contiene el bloqueo. Cuando es necesario determinar si un hilo sostiene el objeto, solo es necesario simplemente determinar si el puntero del encabezado del objeto está dentro del rango de dirección de pila del hilo actual. Al mismo tiempo, el muesteDEd_header del objeto BasicLock respalda el contenido de la palabra marca del objeto original, y el campo OBJ del objeto BasicObjectLock apunta al cabezal del objeto que contiene el bloqueo.
3. Lock de peso pesado
Cuando el bloqueo liviano falla, la máquina virtual usará el bloqueo de peso pesado. Cuando se usa cerraduras de peso pesado, la palabra de marca del objeto es la siguiente:
[PTR | 10] Monitor
Durante la operación, el hilo puede suspenderse a nivel del sistema operativo. Si es así, el costo de cambiar y llamar entre hilos aumentará considerablemente.
4. Bloqueo de giro
Un bloqueo de giro puede hacer que el hilo no se suspenda cuando no ha obtenido el bloqueo, sino que cambia para ejecutar un bucle vacío (es decir, el llamado giro, lo que significa ejecutar el bucle vacío en sí). Si el hilo puede obtener el bloqueo después de varios bucles vacíos, continuará ejecutándose. Si el hilo aún no puede obtener el bloqueo, se suspenderá.
Después de usar el bloqueo de spin, la posibilidad de suspender el hilo se reduce relativamente, y la consistencia de la ejecución de subprocesos se mejora relativamente. Por lo tanto, tiene cierta importancia positiva para los hilos concurrentes que no son muy competitivos con las cerraduras y tienen un tiempo muy corto. Sin embargo, para programas concurrentes que son ferozmente competitivos con cerraduras y cerraduras de un solo hilo ocupan mucho tiempo, el bloqueo de giro a menudo no puede obtener el bloqueo correspondiente después de la espera de giro. Esto no solo desperdicia el tiempo de la CPU, sino que también inevitablemente tiene la operación suspendida al final, sino que también desperdicia los recursos del sistema.
En JDK1.6, la máquina virtual Java proporciona el parámetro -xx:+usado para habilitar el bloqueo de giro, y usa el parámetro -xx: preblockspin para establecer el número de veces que espera el bloqueo de spinning.
A partir de JDK 1.7, se cancelan los parámetros del bloqueo de giro. La máquina virtual ya no es compatible con el bloqueo de spin con configuración de usuario. El bloqueo de giro siempre se ejecutará, y la máquina virtual ajusta automáticamente el número de bloqueos giratorios.