O primeiro metodo não tem qq coisa sincronizada, já o segundo é sincronizado.
quando se faz o " synchronized(Filho.class) { " se tenta sincronizar o Class Filho, que é uma representação, não uma instancia em específico, então a tentativa de sincronização falha, mas não há erro explicito.
E
eusoufeioedaiPJ
qual seria a diferença se o método main fosse trocado por este aqui ?
publicstaticvoidmain(Stringargs[]){//new Thread (new Filho()).start();// new Thread (new Filho()).start();// new Thread (new Filho()).start();
rodando o código eu percebi que utilizando o método sincronizado, e não o bloco sincronizado, a variável ‘a’ não é incrementada de forma sincronizada, ou seja, não obtenho o resultado: 1,2,3…
por que ?
B
BrunoCarloPJ
Ola,
Só pra constar, quando vc sincroniza um metodo, ele só é sincronizado para a instancia, se duas thread quizer acessar o mesmo método, da mesma instancia… então no caso apresentado, que há varias instancias, não seria anormal vc ter printado no resultado os valores fora de ordem.
B
BrunoCarloPJ
Ola,
Só pra constar, quando vc sincroniza um metodo, ele só é sincronizado para a instancia, se duas thread quizer acessar o mesmo método, da mesma instancia… então no caso apresentado, que há varias instancias, não seria anormal vc ter printado no resultado os valores fora de ordem.
S
SchuenemannPJ
Segundo li num artigo da Java Magazine, a segunda forma tem desempenho melhor, pois ao encontrar 2 métodos sincronizados, o Java pode tornar isso um só bloco sincronizado (desde que usem o mesmo objeto), não sendo necessário liberar os locks e reservar novamente.
Isso:
void synchronized x() {
int y = 10;
// mais código
}
// outro método
x();
x();
seria melhor até mesmo que isso:
void x() {
int y = 10;
synchronized(this) {
// mais código
}
}
// outro método
x();
x();
Lembrando que o primeiro código deveria usar uma instância.
uma instância para três threads eu já fiz.
Funciona se o método for sincronizado ou o bloco conter o objeto ‘this’, né ??
Como a variável é estática, eu queria saber como uma variável estática se comporta se for utilizado três instâncias diferentes com três threads diferentes, entendeu ??
Utilizando o método sincronizado com três objetos diferntes eu não consegui obter a saída 1,2,3… , mas utilizando o bloco sincronizado - synchronized(Filho.class) - eu consegui obter a saída 1,2,3…
Eu posso estar um pouco perdido, mas é que eu estou tentando entender a lógica de funcionamento dos métodos e blocos sincronizados