Acerca de las categorías de hilo

  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

 

  • Dejar que la clase inmutable

    1. 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 , prestar atención si la variable miembro es un objeto, el objeto que corresponde a la clase no debe ser cambiado, con el fin de garantizar que toda la clase es inmutable;finalfinalfinal

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

    volatileSe 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;

   hilo relación de intercambio, la memoria principal, la memoria de trabajo de los tres

     

 

 

  Desde la variable, la memoria principal, definimos la memoria de trabajo plazo, la memoria principal, la instancia del objeto principal correspondiente a la parte de datos de la pila de Java, mientras que la porción correspondiente al área de memoria de trabajo de la pila de la máquina virtual; nivel inferior de dicha memoria principal corresponde directamente con el hardware físico, la memoria, y con el fin de obtener una mejor velocidad, sistema de hardware (incluso optimizaciones en sí) de la máquina virtual puede dar prioridad a la memoria de trabajo y los registros de memoria y la memoria caché, como el principal acceso al programa se está ejecutando la lectura y la escritura es la memoria de trabajo;

 

  El siguiente código: Correr resultado es un ciclo de muerte

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:

 

    

 

  Las variables anteriores isRunning código con modificaciones, los resultados son los procedimientos de salida normales;volatile

 

  En el volátil y reordenamiento, ver

 

  JVM define sucede-Antes principio es un grupo de orden parcial, en el JMM, si un resultado de la ejecución de la operación requiere otra operación para ser visto, estas dos operaciones deben estar presentes sucede-antes de relación, dos mencionado aquí relación operativa puede estar en un hilo, el hilo puede ser diferente en directo, es decir, para las dos operaciones a y B, estas dos operaciones se pueden realizar en diferentes hilos; si un sucede-Antes de B, que puede ser garantizada, un opera cuando se ejecutan, realizan operaciones sobre el resultado de la operación de un B es visible;

 

  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:

    

 

  • CAS y bloqueo

    Clase mediante una operación atómica, sincronizada, Lock

     

  • ThreadLocal

   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;

 

 

 

Supongo que te gusta

Origin www.cnblogs.com/coder-zyc/p/12650557.html
Recomendado
Clasificación