Descripción general
Recientemente, estaba leyendo "Pensando en Java". Y muy básico.
1. Volátil
Volátil se usa principalmente para sincronizar variables en múltiples lecturas.
En general, para mejorar el rendimiento, cada hilo guardará una variable en la memoria principal como una copia variable en su propia memoria cuando se está ejecutando, pero es fácil causar variables de réplica inconsistentes guardadas en múltiples hilos. Valor variable en la memoria principal.
Cuando Volatile modifica una variable, la variable no se puede almacenar en la memoria del hilo. "." La copia variable del área de memoria, por lo que cuando cambia la variable, todos los subprocesos que llaman a la variable obtendrán el mismo valor, lo que garantiza la visibilidad de la variable en la aplicación (cuando una tarea se modifica en la aplicación debe ser visual ), y el rendimiento también se ha reducido en consecuencia (aunque es más alto que el sincronizado).
Sin embargo, debe tenerse en cuenta que Volátil solo puede garantizar que la operación sea la misma pieza de memoria y no pueda garantizar la atomicidad de la operación. Por lo tanto, el volátil se usa generalmente para declarar variables de tipo simple, de modo que estas variables sean atómicas, es decir, algunas operaciones simples de asignación y retorno se asegurarán de que no se interrumpan. Sin embargo, cuando el valor de la variable está determinado por su propio anterior, el papel de volátil no será válido, que está determinado por la naturaleza de la palabra clave volátil.
Por lo tanto, tenga cuidado cuando sea volátil.
2.Threadlocal
En primer lugar, ThreadLocal no tiene una relación de diez centavos con el hilo local, y no es un hilo especial. Utiliza la variable, por lo que cada hilo puede cambiar de forma independiente su propia copia sin afectar la copia correspondiente a otros subprocesos. En realidad, esta es una forma de intercambiar espacio para el tiempo (en lugar de sincronizado), lo que reduce en gran medida el consumo de rendimiento traído por la sincronización de hilos (como sincronizado) y reduce la complejidad del control concurrente de hilo a costa de la memoria.
Personalmente, creo que un ejemplo típico es el uso de ThreadLocal en el código fuente de Android sobre Looper, que también incluye el uso básico de ThreadLocal.
clase pública Looper {static final static string tag = "looper"; // shhreadlocal.get () devolverá nulo a menos que haya llamado preparar (). Private static looper mmainlooper = null; sthreadlocal.set (new Looper ()); looper) {mmainlooper = looper; ..}
Pero debe tenerse en cuenta que aunque Threadlocal y Synchonized se usan para resolver el acceso concurrente múltiple, todavía hay una diferencia fundamental entre ThreadLocal y Syncronized. Sincronizado utiliza el mecanismo de bloqueo para que las variables o bloques de código solo puedan acceder mediante un hilo en un momento determinado. ThreadLocal proporciona una copia de la variable para cada subproceso, de modo que cada hilo no acceda al mismo objeto en un momento determinado, lo que aísla el intercambio de datos de datos mediante múltiples subprocesos. Sincronizado es lo contrario, se utiliza para obtener el intercambio de datos al comunicarse entre múltiples hilos. Es decir, sincronizado se usa para compartir datos entre hilos, mientras que ThreadLocal se usa para el aislamiento de datos entre hilos. Por lo tanto, ThreadLocal no puede reemplazar sincronizado, y Sincronized tiene una gama más amplia de funciones (mecanismo de sincronización).
3. sincronizado
Java implementa automáticamente la palabra clave sincronizada utilizando el mecanismo de bloqueo. Todos los objetos en Java contienen automáticamente un solo bloqueo (también conocido como monitores). y antes de que el hilo regrese de este método, se bloquearán todos los demás hilos en el objeto que desean llamar al método marcado sincronizado en la clase. Por supuesto, también hay un bloqueo para cada clase (como parte del objeto de clase de la clase), por lo que ya sabes ^. ^.
Finalmente, es importante tener en cuenta que sincronizado es la forma más segura del mecanismo de sincronización.