La primera parte de la base de seguridad de subprocesos múltiples de JAVA (a)

Portal de notas concurrentes:
1.0 Programación concurrente-Mapa mental
2.0 Programación concurrente-Fundamentos de seguridad de subprocesos
3.0 Programación concurrente-Módulo de construcción básico
4.0 Programación concurrente-Ejecución de tareas-Futuro
5.0 Programación concurrente-Rendimiento y escalabilidad de subprocesos múltiples
6.0 Programación concurrente- Bloqueo explícito y
programación concurrente sincronizada 7.0-AbstractQueuedSynchronizer
8.0 programación concurrente-variables atómicas y mecanismo de sincronización sin bloqueo

Seguridad mínima

Cuando un hilo lee una variable sin sincronización, puede obtener un valor no válido, pero al menos este valor es un valor establecido por un hilo anterior, no un valor aleatorio. Este tipo de garantía de seguridad se denomina seguridad mínima.

La seguridad mínima se aplica a la mayoría de las variables, pero hay una excepción, las variables numéricas de 64 bits no volátiles (double y lang). El modelo de memoria de Java requiere que las operaciones de lectura y escritura de variables sean operaciones atómicas, pero para las variables largas y dobles no volátiles, la JVM permite que la operación de lectura o escritura de 64 bits se descomponga en dos operaciones de 32 bits.

Variables volátiles

Un mecanismo de sincronización más débil para garantizar que otros subprocesos sean notificados de las operaciones de actualización de variables. Cuando se declara como un tipo volátil, tanto el compilador como el tiempo de ejecución notarán que esta variable es compartida, por lo que las operaciones en esta variable no se reordenarán con otras operaciones de memoria. Las variables volátiles no se almacenarán en caché en registros u otros lugares que no sean visibles para el procesador, por lo que al leer una variable volátil, siempre se devolverá el último valor escrito.

El mecanismo de bloqueo puede garantizar tanto la visibilidad como la atomicidad, mientras que las variables volátiles solo pueden garantizar la visibilidad.

  • condiciones de uso volátiles (si y solo si)
    • La operación de escritura en la variable no depende del valor actual de la variable, o para garantizar que solo un único hilo actualice el valor de la variable.
    • Esta variable no se incluirá en la condición de invariancia junto con otras variables de estado.
    • No se requiere bloqueo al acceder a las variables.

Cierre de hilo

Evite el uso de datos de sincronización y acceso en un solo hilo. La tecnología confiable de cierre de roscas incluye 栈封闭yThreadLocal

Cierre de hilo ad-hoc

维护线程封闭性的职责完全由程序实现来承担。该方式是非常脆弱的。
可以通过在 volatile 变量上实现一种特殊的线程封闭。
确保只有单个线程对共享的 volatile 变量执行写入操作,
那么就可以安全的就可以安全的在这些共享的 volatile 变量上执行·读取·-·修改·-·写入·的操作。
在这种情况下,相当于将修改操作封闭在单个线程中以防止发生竟态条件,并且 volatile 变量还确保了其可见性。

Pila cerrada

线程封闭的一种特例,栈封闭中,只能通过局部变量才能访问对象。
局部变量的固有属性之一就是封闭在执行线程中。
它们位于执行线程的栈中,其他线程无法访问这个栈。

ThreadLocal 类

Haga clic aquí para obtener el código fuente detallado

ThreadLocal 提供了 get 和 set 等访问接口和方法。
这些方法为每个使用该变量的线程都存有一份独立的副本,
因此 get 总是返回由当前执行线程在调用 set 时设置的最新值。

Inmutabilidad

Objeto inmutable

Después de que se crea un objeto, su estado no se puede modificar, entonces este objeto se llama un objeto inmutable.

不可变对象很简单,它们只有一种状态,并且该状态由构造函数控制。

Dominio final

final se utiliza para construir objetos inmutables. El campo de tipo final no es modificable (pero si el objeto al que hace referencia el campo final es mutable, estos objetos a los que se hace referencia pueden modificarse)
comprensión profunda de la palabra clave final

final 域能确保初始化过程的安全性,从而可以不受限制的访问不可变对象,并在共享这些对象时无需同步。

Objeto de liberación de seguridad

要安全发布一个对象,对象的引用和状态必须同时对其他线程可见。
一个正确构造的对象可以通过以下方式来安全发布。
    * 在静态初始化函数中初始化一个对象引用
    * 将对象的引用保存到 volatile 类型的域或AtomicReferance中
    * 将对象的引用保存到某个正确构造对象的 final 域中
    * 将对象的引用保存到由锁保护的域中

Supongo que te gusta

Origin blog.csdn.net/lijie2664989/article/details/103234782
Recomendado
Clasificación