, así que estaba probando con la palabra clave synchronized
. Aquí hay un ejemplo que he intentado:Aprendizaje de Java, uso de la palabra clave sincronizada
public class MyTest {
static int i = 0;
public static void main(String[] args) {
new Thread(t1).start();
new Thread(t2).start();
}
private static void countMe(String name){
i++;
System.out.println("Current Counter is: " + i + ", updated by: " + name);
}
private static Runnable t1 = new Runnable() {
public void run() {
try{
for(int i=0; i<5; i++){
countMe("t1");
}
} catch (Exception e){}
}
};
private static Runnable t2 = new Runnable() {
public void run() {
try{
for(int i=0; i<5; i++){
countMe("t2");
}
} catch (Exception e){}
}
};
}
Cuando lo ejecuto, la salida de llamar countMe()
método de dos hilos genera esta salida:
Current Counter is: 1
Current Counter is: 2
Current Counter is: 4
Current Counter is: 5
Current Counter is: 6
Current Counter is: 7
Current Counter is: 3
Current Counter is: 8
Current Counter is: 9
Current Counter is: 10
Y cuando cambio el método countMe()
a:
private synchronized static void countMe(){
i++;
System.out.println("Current Counter is: " + i);
}
puedo obtener este resultado:
Current Counter is: 1
Current Counter is: 2
Current Counter is: 3
Current Counter is: 4
Current Counter is: 5
Current Counter is: 6
Current Counter is: 7
Current Counter is: 8
Current Counter is: 9
Current Counter is: 10
Aunque esto me permite entender claramente el propósito de synchronized
, también quiero saber si hay alguna otra razón por la que podamos usar synchronized
. O lo que he hecho aquí, ¿es la única razón por la que necesitamos el uso de esta palabra clave synchronized
?
Gracias.
EDIT: Otra cosa que estoy confundido con es que en la primera salida por qué el contador fue a 3 después de 7. Me parece un poco imposible para mí, pero un efecto similar hace suceder cada vez que intento, es esto normal ?
No hay garantía de que los hilos se alternarán. El hilo que contó 3 puede no imprimirse hasta que el otro hilo haya contado hasta 7. –
gracias, pero al igual que después de 7 ¿cómo puede la próxima llamada imprimir 3. Quiero decir que podría imprimir 6 o incluso 5, pero esta parece ser la nueva llamada al método no lo leí después de que fue 3, esto suena muy extraño. ¿Entonces crees que debería ser inteligente usar siempre sincronizados cada vez que tengo que usar el mismo bloque de código de 2 o más hilos? – 911TurboS
Te sugiero que imprimas el nombre de la secuencia y será más obvio dónde está la confusión. La concurrencia es un tema complejo y no hay respuestas simples. Mi preferencia es usar patrones de actor y compartir la menor cantidad de datos posible entre los hilos. idealmente, ninguno. Un hilo que realiza código de manera muy eficiente suele ser más que suficiente. –