Si tu código está en un proceso que tiene varios hilos ejecutándose al mismo tiempo, puede estar ejecutando el código al mismo tiempo. Si el resultado de cada ejecución es el mismo que el de un solo hilo, y los valores de otras variables son los mismos que se esperaban, es seguro para hilos. En otras palabras, que la interfaz proporcionada por una clase o programa sea atómica para los hilos o que cambiar entre múltiples hilos no genera ambigüedad en el resultado de ejecución de la interfaz, lo que significa que no necesitamos considerar la sincronización. Los problemas de seguridad del hilo están causados tanto por variables globales como estáticas. Si cada hilo solo tiene operaciones de lectura para variables globales y variables estáticas, pero no operaciones de escritura, en términos generales, esta variable global es segura para hilos; Si varios hilos realizan operaciones de lectura y escritura sobre una variable al mismo tiempo, generalmente se requiere sincronización de hilos, de lo contrario puede afectar a la seguridad del hilo.
El propósito del bloqueo es evitar operaciones concurrentes cuando la ejecución multihilo es de ejecución, y los objetos del tipo de referencia permiten que solo un hilo opere a la vez en su área bloqueada.
El bloqueo solo puede bloquear una variable de tipo de referencia, es decir, bloquear una dirección
Hay una diferencia entre los resultados de correr con y sin bloqueo:
Después del bloqueo: el valor de i disminuirá uno a uno, no habrá saltos, ni salidas repetidas, hasta el valor de 0;
Sin bloqueo: el valor de salida de i saltará, disminuirá discontinuamente, y también puede tener una salida de valor -1;
Razón: Después de añadir un bloqueo, solo un hilo puede ejecutar el código en el área bloqueada a la vez, y ambos hilos se ejecutan en orden, por lo que no habrá salida interrumpida. |