Si utiliza esta clase multi-hilo, multi-hilo, pero cómo utilizar y programar la clase, que siempre muestra el comportamiento correcto, esta clase es seguro para subprocesos; no lo haga una correcta sincronización, estado compartido entre varios subprocesos tiempo, no será seguro hilo;
Hilo de seguridad clase de rendimiento de la siguiente manera:
-
operación atómica
-
memoria de la visibilidad
-
pila cerrada
Todas las variables se declaran dentro del método, estas variables están en el estado cerrado pila;
-
apátrida
No hay variables miembro de la clase
-
-
Añadir palabras clave, todas las variables miembro deben ser privadas, al mismo el mayor tiempo posible, todas las variables miembros deben añadir palabras clave, pero con
final
final
final
FinalRef public class { int final privado a; int final privado b; usuario final privado del usuario; //这里不能保证线程安全啦 FinalRef público (int a, int b) { this.a = a; this.b = b; this.user = new User (); } Public int Geta () { volver a; } Public int getB () { retorno b; } Usuario pública getUser () { usuario de retorno; } Pública del usuario clase estática { int edad privada; Usuario pública (int edad) { super (); this.age = edad; } Public int getAge () { edad de retorno; } Pública setAge vacío (int edad) { This.age = edad; } } public static void main (String [] args) { FinalRef nueva nueva FinalRef REF = (12,23); el usuario ref.getUser T = (); // donde el usuario puede modificar el valor de // u. la setAge (35); } }
2. no proporciona ninguna lugares para modificar las variables miembro, las variables miembro, al mismo tiempo que el método no valor de retorno;
-
volátil
volatile
Se puede utilizar en un entorno multi-roscado, clase garantizada visibilidad , es decir, un hilo modificado, otro hilo se puede leer, pero no lo hace la atomicidad de garantía;volatile
Java específica modelo de memoria que todas las variables se almacenan en la memoria principal; cada hilo tiene su propia memoria de trabajo, trabajando hilo de memoria almacenada en la copia de la memoria principal de la copia es utilizar la variable de hilo (si es una variable local tipo de referencia, los objetos compartidos los que hace referencia son diferentes hilos en el montón de Java disponible, pero la propia tabla se refiere a una pila variable local en Java, es un hilo privado) , hilo de todas las operaciones sobre las variables (lectura, tareas, etc.) debe llevarse a cabo en la memoria de trabajo, pero no puede leer y escribir directamente a las variables principales de memoria; entre los diferentes hilos no pueden acceder a las variables de memoria de trabajo directamente, se requiere que el valor variable pasada entre hilos para completar la memoria principal;
public class extends Thread {RunThread isRunning private boolean = true; isRunning public boolean () { isRunning retorno; } Pública setRunning vacío (en ejecución booleano) { isRunning = correr; } @Override public void run () { System.out.println (Thread.currentThread () getName () + "进入plazo".); while (IsRunning) { } System.out.println (Thread.currentThread () getName () + "线程停止".); } Public static void main (String [] args) throws InterruptedException { RunThread hilo = new RunThread (); hilo.start (); Thread.sleep (1000); thread.setRunning (false); System.out.println (Thread.currentThread () getName () + "已经赋值falsa".); } }
Existen variables de pila IsRunning en público y privado a la pila de subprocesos (donde la pila común hace referencia a la memoria principal, hilos pila privado se refiere a un hilo de la memoria de trabajo), el programa ha estado operando en el valor privado de la pila adquirida de hilo IsRunning cierto, aunque thread.setRunning ejecución (falso) en el hilo principal, la actualización se IsRunning pila variable común, la modificación a las roscas es sin variables perceptuales, dos operación de memoria es la dirección de datos, como se muestra a continuación:
Si el sueño comentó anteriormente, el resultado final del programa puede ser normal, thread.setRunning (false) ejecución de la operación se ha completado, otro isRunning hilo leerse como un valor de false;
Cuando una variable se modificó más tarde, tendrá dos funciones, la primera es asegurar que esta variable visibilidad a todas las discusiones, la visibilidad aquí es cuando un hilo cambia el valor de esta variable, el nuevo valor es visible a otro hilo puede ser aprendido inmediatamente;volatile
y variables comunes no pueden hacer esto, se requiere que el valor de la transmisión variable común para completar la memoria principal entre los hilos, tales como hilo de una modificación del valor de una variable común y, a continuación, escrita de nuevo a la memoria principal, además de una escritura no simultánea hilo de rosca B una después de la finalización de la operación de lectura de la memoria principal, memoria de trabajo B para leer el hilo, una nueva variable será visible para enhebrar B;
Utilice la palabra clave, las variables pueden ser obligados a leer desde la memoria principal (memoria común) valor, sin pasar por la memoria de trabajo de la roscavolatile
, como se muestra a continuación:
-
Clase mediante una operación atómica, sincronizada, Lock
-
Utilizar variables de subproceso local
Servlet no es seguro para subprocesos clase para los recursos compartidos, no será seguro para hilos;. Ciclo de vida del servlet es recibir una solicitud para crear un servlet, devuelve una respuesta, la destrucción de servlet, son responsables de un hilo;
- punto muerto
Estancamiento se refiere a dos o más de dos hilos en el proceso de implementación, debido a la competencia por los recursos o se comunican entre sí y porque el fenómeno de bloqueo A causó , en ausencia de una fuerza externa, que no será capaz de promoverlo. En este momento, dicen que el sistema se encuentra en punto muerto estado o sistema para producir un callejón sin salida , que siempre está en el proceso de esperar a que la otra se llama un callejón sin salida ;
Cuando más de un recurso, pero menor que el número de hilos de igual competencia, a fin de obtener la inconsistencia de bloqueo conducirá a un punto muerto, cuando sólo uno de los recursos, producirá competitiva, la solución: jstack Existencias cerraduras de aplicación; asegurar una ordenada bloqueado ;
estancamiento secuencia dinámica en el logro de una cerradura en un cierto orden, pero debido a problemas de llamadas externas, lo que no hay garantía de que la secuencia de bloqueo genera; resolución: ordenar a través de la inherente, asegurar una ordenada bloqueada; también puede probar tomar la cerradura;
- livelock
Livelock se refiere a la tarea o artista no está bloqueada , debido a que algunas condiciones no se cumplen, lo que resulta en repetidos intentos - no - intento - el fracaso del proceso; entidad es bloqueo activo está en constante estado de cambio, es posible vivir en sus propias cerraduras desbloquear; siguientes ejemplos:
/ ** *类说明:不会产生死锁的安全转账方法,尝试拿锁 * / public class implementos SafeOperate iTransfer { @ Override transferencia public void (UserAccount de, UserAccount a, cantidad int) lanza InterruptedException { aleatoria r = new Aleatorio(); while (true) { si (from.getLock () trylock ().) { try { System.out.println (Thread.currentThread () getName (). + "obtener" + from.getName ()); si (to.getLock () trylock ().) { try { System.out.println (Thread.currentThread () getName (). + "obtener" + to.getName ()); // tenga que tomar dos cerraduras al from.flyMoney (cantidad); to.addMoney (CANTIDAD); ; PAUSA } {el fin to.getLock () UNLOCK () ;. } } } {el fin from.getLock () UNLOCK () ;. } } hilos // compensados tomar tiempo para bloqueo //Thread.sleep(r.nextInt(10)); } } }
El sueño de rosca por encima de bloqueo de rosca escalonada a tomar el tiempo para mirar mucho tiempo en estado latente, pero la eficiencia será mejorado, para reducir los repetidos intentos de aparecer - el número de fallos;