Cosas a considerar al escribir código seguro para subprocesos:
1. Variables compartidas
2. Variables mutables
Compartido significa que varios subprocesos pueden acceder a él al mismo tiempo y mutable significa que su valor puede cambiar durante su ciclo de vida.
Por ejemplo, la siguiente variable de recuento:
Copie el código de código de la siguiente manera:
//Clase no segura para subprocesos
clase pública UnsafeCount {
private int count = 0; //Esta variable es compartida
public void rise() { // No hay ningún mecanismo de sincronización aquí, varios subprocesos pueden acceder al mismo tiempo
contar++; //Esta variable es variable
}
público int getCount() {
recuento de devoluciones;
}
}
Hay 4 formas de solucionar este problema:
1. En lugar de compartir la variable de estado entre subprocesos, puede encapsular la variable en un método (los objetos sin estado deben ser seguros para subprocesos porque las variables en el método son exclusivas de cada subproceso y no se comparten con otros subprocesos); Por ejemplo:
Copie el código de código de la siguiente manera:
public int add(int recuento){
return ++count;// Aquí también se puede decir que los objetos sin estado deben ser seguros para subprocesos
}
2. Modifique la variable de estado a una variable inmutable.
Copie el código de código de la siguiente manera:
recuento int final privado = 0;
3. Utilice una estrategia de sincronización al acceder a variables de estado.
Copie el código de código de la siguiente manera:
aumento de vacío sincronizado público () {
contar++;
}
4. Utilice clases de variables atómicas.
Copie el código de código de la siguiente manera:
recuento privado de AtomicInteger;
aumento de vacío público() {
contar.getAndAdd(1);
}