Digamos que tengo un método, al que se accede por dos o más subprocesos y quiero que sea seguro para subprocesos.Sincronización de los parámetros formales en java
public int getVal(int x, int y, MyClass myObj)
{
int z;
z = getInt(myObj);
return x + y + z;
}
En esto, creo que no tenemos que sincronizar para x + y ya que son primitivos.
Supongamos que getInt(myObj)
modifica el estado de myObj y que influye en el valor de z.
Por lo tanto, tendré que proporcionar la sincronización para la línea z = getInt(myObj);
pero solo cuando ambos hilos pasen la misma instancia en la referencia 'myObj'. Como el codificador de la API no sabría si ambos hilos pasarían la misma instancia para 'myObj' o no. En algunos casos, estos hilos pueden pasar la misma instancia de MyClass en la referencia 'myObj' y en otros casos pueden pasar diferentes instancias de MyClass en la referencia 'myObj'.
Entonces, ¿cómo se puede garantizar la seguridad del hilo para la línea z = getInt(myObj)
? (Seguramente, no queremos sincronizar cuando las instancias pasadas son diferentes y solo tienen que sincronizarse cuando las instancias pasadas son iguales. Es claro que esto no se puede determinar).
Suponiendo que MyClass no se puede convertir en inmutable, creo que lo siguiente podría ser una solución.
synchronized(myObj)
{
z = getInt(myObj);
}
¿Es la solución correcta? Y, en lo que otras maneras podemos garantizar la seguridad de los subprocesos para
z = getInt(myObj); (but only in case of different instances)?
su bloque sincronizado es suficiente. La JVM bloquea en esa llamada cada vez que el monitor para el objeto sincronizado es retenido por otra cadena. –
@Brent, ¿hay alguna otra manera de hacerlo? ¡Sólo me preguntaba! –
Su sincronizado() es peligroso. revisa mi respuesta a continuación. – iluxa