La Red de Conocimientos Pedagógicos - Currículum vitae - ¿Cuáles son los mecanismos de sincronización para el desarrollo multiproceso de Java?

¿Cuáles son los mecanismos de sincronización para el desarrollo multiproceso de Java?

Sincronización de Java

Etiquetas: Categoría:

1. Palabras clave:

Subproceso, seguro para subprocesos, concurrente

Sincrónico (sincrónico), asincrónico (asincrónico),

Volatile (volatile), atómico (atómico), compartido (compartido por * * *)

II. y escribe de una vez * * * y disfruta de la redacción de documentos. Vaya, muchacho, encontré estos fragmentos de conocimiento en el camino. A partir de esto, Google y Google leen el "Libro de referencia de Java" y la "Segunda edición de Java efectiva" y los resumen para trabajos y estudios futuros.

En tercer lugar, conceptos:

1. ¿Cuándo tengo que sincronizar? ¿Qué es la sincronización? ¿Cómo sincronizar?

Para mantener una visibilidad correcta entre subprocesos, siempre que una variable no final se comparte entre varios subprocesos, debe estar sincronizada (o volátil) para garantizar que un subproceso pueda ver los cambios realizados por otro subproceso.

La sincronización es necesaria para una comunicación confiable y un acceso mutuamente excluyente entre subprocesos. Esto se debe al modelo de memoria de la especificación del lenguaje Java, que dicta cuándo y cómo los cambios realizados por un subproceso son visibles para otros subprocesos.

Debido a que el subproceso múltiple introduce un comportamiento asincrónico en un programa, debe haber una manera de forzar la sincronización cuando sea necesario. Por ejemplo, si dos subprocesos quieren comunicarse y compartir una estructura de datos compleja, como una lista vinculada, deben asegurarse de que los dos no entren en conflicto, es decir, deben evitar que el subproceso B lea datos antes de que el subproceso A escriba. datos a la lista vinculada al mismo tiempo (A obtiene el bloqueo y B debe esperar a que A libere el bloqueo).

Para lograr este objetivo, Java implementó una solución ingeniosa basada en un antiguo modelo de sincronización de procesos: Monitor: Monitor es un mecanismo de control y puede considerarse como

una pequeña caja. que sólo puede contener un cable. Una vez que un hilo ingresa al monitor, otros hilos deben esperar hasta que el hilo salga del monitor. De esta manera, un líder de escuadrón puede asegurarse de que * * * disfrute de los recursos de la clase.

Sólo puede ser utilizado por un hilo a la vez. Este método se llama sincronización. (Una vez que un subproceso ingresa a cualquier método sincronizado de una instancia, otros subprocesos no podrán ingresar a otros métodos sincronizados de la misma instancia, pero aún se pueden llamar los métodos asincrónicos de la instancia).

Malentendido: La sincronización significa que varios hilos pueden acceder al mismo tiempo.

Sincronización y subprocesos múltiples: sin un entorno de subprocesos múltiples, la sincronización no es necesaria; en un entorno de subprocesos múltiples, la sincronización es innecesaria.

Los candados ofrecen dos características principales: exclusión mutua y visibilidad.

La exclusión mutua significa que solo un hilo puede mantener un bloqueo específico a la vez, por lo que esta característica se puede usar para implementar protocolos de acceso coordinado a datos compartidos para que solo un hilo pueda usarlos a la vez. *Compartir datos.

La visibilidad es más compleja, la documentación. Debe garantizar que los cambios realizados en los datos de disfrute antes de que se libere el bloqueo sean visibles para otro subproceso que posteriormente adquiera el bloqueo; si el mecanismo de sincronización no proporciona tales garantías de visibilidad, entonces el disfrute visto por el hilo tal vez la variable era antes de la modificación. ? ¿Sigue siendo inconsistente? Esto causará muchos problemas graves.

Resumen: para evitar que varios subprocesos modifiquen los mismos datos simultáneamente, se requiere sincronización; de lo contrario, los datos serán inconsistentes (lo que se denomina: seguridad de subprocesos. Por ejemplo, tablas hash y marcos de recopilación de Java

Vector es seguro para subprocesos. La mayoría de nuestros programas no son seguros para subprocesos porque no hay sincronización y no necesitamos sincronización porque en la mayoría de los casos no existe ningún entorno de subprocesos múltiples.

2. ¿Qué es una operación atómica?

Las operaciones atómicas de Java se refieren a operaciones que no serán interrumpidas.

(¿Es mutuamente excluyente y visible?)

Entonces, ¿pueden las operaciones atómicas realmente lograr una sincronización segura para subprocesos? De hecho, algunas operaciones atómicas no son necesariamente seguras para subprocesos.

Entonces, ¿bajo qué circunstancias las operaciones atómicas no son seguras para subprocesos? Quizás esta sea la razón: los subprocesos de Java permiten que los subprocesos guarden copias de variables en sus propias áreas de memoria. ¿Permitir que los hilos usen copias privadas locales para ingresar al trabajo en lugar de usar la memoria principal cada vez? Para mejorar el rendimiento (mi humilde opinión: aunque las operaciones atómicas son seguras para subprocesos, cada subproceso puede funcionar de forma independiente después de obtener la variable (operación de lectura)

Hice una copia yo mismo y la operación de actualización (escribir operación) no es escribir en la memoria principal, lo que hace que sea invisible para otros subprocesos.

Entonces, ¿cómo solucionarlo?

¿En Java, asignación atómica de 32 bits? En las plataformas de hardware de 32 bits, otros tipos básicos, excepto el doble y el largo, generalmente se representan con 32 bits, mientras que los tipos dobles y largos generalmente se representan con 64 bits. Además, las implementaciones de punteros nativos generalmente se utilizan en operaciones de 32 bits. estos tipos de 32 bits son primitivos.

Estos tipos primitivos suelen ser de 32 o 64 bits. Esto introduce otro pequeño mito: el tamaño de los tipos primitivos está garantizado por el lenguaje.

El rango numérico en la JVM está garantizado por el tamaño de almacenamiento. Por lo tanto, el tipo int siempre tiene el mismo rango de números de tabla. Se puede usar una implementación de 32 bits en una JVM. 64 bits en otro.

Tono: El rango de números de tabla está garantizado en todas las plataformas. Las operaciones de 32 bits y menores son atómicas.

3.

Por ejemplo: modo B/S común (sincrónico) Tecnología AJAX (asincrónico)

Sincronización: enviar solicitud - gt; esperar el procesamiento del servidor - gt; durante el proceso de devolución.

p>

Asincrónico: la solicitud se activa mediante un evento - gt; procesamiento del servidor (esto es lo que el navegador también puede hacer) ->; Se puede ver que "sincronización" no es esta "sincronización"—— De lo que estamos hablando es de * * * disfrutar de la sincronización de datos en Java

El objeto de sincronización se refiere al comportamiento (acción), y el objeto de sincronización se refiere al material (* * * compartir datos).

4. Hay cuatro formas de implementar el mecanismo de sincronización de Java: (consulte parcialmente los recursos en línea)

①thread. local②synchronized()③wait() y notify() ④ volátil

Propósito: Resolver múltiples problemas de acceso para la misma variable en el hilo

Subproceso local

ThreadLocal garantiza que diferentes subprocesos tengan diferentes instancias, y el mismo subproceso debe tener la misma instancia, es decir, cada usuario usa la misma instancia. Los subprocesos variables proporcionan una variable que cada subproceso puede cambiar de forma independiente sin entrar en conflicto con las copias de otros subprocesos. /p>

Ventaja: proporciona un objeto seguro para subprocesos. p>Diferencias con otros mecanismos de sincronización: el mecanismo de sincronización sincroniza el acceso concurrente de múltiples subprocesos al mismo recurso y la comunicación entre múltiples subprocesos aísla el intercambio de datos; múltiples subprocesos y fundamentalmente no es utilizado por múltiples subprocesos. Los recursos se comparten entre subprocesos, por lo que, por supuesto, no es necesario sincronizar varios subprocesos.

Inestable

Cada vez que un hilo accede a una variable miembro modificada volátil, se ve obligado a volver a leer la variable miembro desde * * * memoria compartida. . Además, cuando las variables miembro cambian, ¿forzar que el hilo también cambie? Escribe de nuevo * * * Disfruta los recuerdos.

Ventajas: Entonces, en cualquier momento, ¿dos hilos diferentes siempre ven la misma variable miembro? .

Razón: La especificación del lenguaje Java

establece que para una mejor velocidad, los subprocesos pueden guardar copias privadas de las variables miembro solo cuando el subproceso ingresa o sale de un bloque de código sincronizado. capaz de compartir variables miembro con * * * primitivo.

¿Empezar? contraste. De esta manera, cuando varios subprocesos interactúan con un objeto al mismo tiempo, se debe prestar atención a permitir que los subprocesos obtengan cambios en las variables miembro de manera oportuna. Y la palabra clave volátil

indica a VM: No puede guardar una copia privada de esta variable miembro y debe interactuar con la variable miembro * * * directamente.

Consejo: utilice volátil para variables miembro a las que acceden dos o más subprocesos. No es necesario utilizarlo cuando la variable a acceder ya está en un bloque sincronizado o es una constante.

Para mejorar la eficiencia, un hilo copia una variable miembro (como A) (como B. El acceso a A en el hilo es en realidad un acceso a B. La sincronización de A y B). solo en ciertos casos tiene lugar durante la acción, por lo que hay una inconsistencia entre A y B.

Situación. Volatile se utiliza para evitar esta situación.

Volatile le dice a la jvm que las variables que modifica no retienen copias y es mejor acceder a ellas directamente (a menudo se usan operaciones de lectura; se requiere comunicación entre subprocesos, lo cual este artículo no puede hacer)

Sí, las variables mutables tienen características de visibilidad sincronizadas, pero no tienen características atómicas. Esto significa que los subprocesos pueden descubrir volátiles automáticamente.

¿La última variable? . Se pueden usar variables inestables para proporcionar seguridad a los subprocesos, pero solo para un conjunto muy limitado de casos de uso: ¿entre múltiples variables o dentro de una variable? ¿Y después de la modificación?

No existen restricciones entre ellos.

Las variables volátiles solo se pueden utilizar en lugar de bloqueos en circunstancias limitadas. Para que las variables volátiles proporcionen una seguridad de subprocesos ideal, se deben cumplir las dos condiciones siguientes simultáneamente:

¿La escritura de la variable no depende de la corriente? ;Esta variable no está incluida en una invariante con otras variables.

Sleep() y wait()

Sleep es un método similar a un subproceso que suspende la ejecución de este subproceso dentro de un tiempo específico y brinda la oportunidad de ejecución a otros subprocesos. el estado de monitoreo permanece sin cambios y se restaurará automáticamente más tarde. Llamar al modo de suspensión no libera el bloqueo del objeto.

Wait es un método de la clase Object. Llamar al método de espera en este objeto hará que el hilo abandone el bloqueo del objeto y entre al grupo de bloqueos de espera para esperar este objeto. Solo después de emitir el método de notificación (o notificar a todos) para este objeto, este hilo ingresa al grupo de bloqueo de objetos para adquirir el bloqueo del objeto y entra en el estado de ejecución.

(Si una variable se declara volátil, será consistente con la memoria principal cada vez que se acceda a ella; si se accede a una variable en un método sincronizado o bloque sincronizado, se obtendrá en la entrada de el método o bloque sincronizado, y cuando el bloqueo se libera cuando el método o bloque sincronizado sale, la variable se sincronizará)