Boa noite, gostaria de saber o seguinte: Se eu crio varias threads e cada uma delas usa uma instancia diferente da classe X. Se cada thread só mexe em seu objeto, os métodos da minha classe X(ou objeto X) terão que ser synchronized ou não?
Neste caso, não. O synchronized serve para bloquear o acesso mútuo a uma região crítica de código. Como são objectos distintos, não hão necessidade.
Att.
E se cada uma destas threads chamar um metodo static de outra classe passando como argumentos atributos dos objetos, como por exemplo:
public static int calculo(int x, int y) {
return x + y;
}
o metodo calculo deverá ser synchronized?
Cuidado: nesse caso, você passou apenas cópias de atributos (porque os valores são de tipos primitivos). Nesse caso em particular, não é necessário sincronizar.
Se os atributos passados como parâmetros forem de tipos objetos e esses tipos objetos forem mutáveis, então você talvez precisasse sincronizar o método. É necessário você pensar um pouco sobre o que está fazendo, para evitar sincronização excessiva.
Note que “public synchronized static algumaCoisa()” sincroniza sobre o objeto java.lang.Class que representa a classe onde está esse método, não sobre algum eventual objeto. Tome cuidado e não use synchronized a torto e a direito sem saber o que está fazendo.
Obrigado.
Muito cuidado ao usar métodos e atributos estáticos com threads. Eles podem gerar programas thread-unsafe mesmo com sincronização associada. Uma condição conhecida como thread-hostile. O uso de static já é desaconselhado por várias razões relacionadas à modelagem, e multi-threading é ainda outro forte argumento contra.