dúvida sobre Thread

7 respostas
E

Olá !!!

De acordo com o seguinte código:


public class Filho implements Runnable {

static int a = 0;

public void run ( ) {

soma();

}
public void soma(){

synchronized(Filho.class) {

a=a+1;

System.out.println(a +" C= "+ Thread.currentThread().getName());

}

}
public static void main ( String args[]) {

new Thread (new Filho()).start();

new Thread (new Filho()).start();

new Thread (new Filho()).start();

}

}

qual é a diferença entre os seguintes métodos ?


método 1:

public void soma(){

synchronized(Filho.class) {

a=a+1;

System.out.println(a +" CT= "+ Thread.currentThread().getName());

}

}

método 2:

public synchronized void soma(){

a=a+1;

System.out.println(a +" CT= "+ Thread.currentThread().getName());

}

Obrigado pela atenção !!!

7 Respostas

B

Simples,

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

qual seria a diferença se o método main fosse trocado por este aqui ?


public static void main ( String args[]) {

//new Thread (new Filho()).start();

// new Thread (new Filho()).start();

// new Thread (new Filho()).start();
Filho f1 = new Filho();

Filho f2 = new Filho();

Filho f3 = new Filho();
Thread t1 = new Thread (f1);

Thread t2 = new Thread (f2);

Thread t3 = new Thread (f3);
t1.start();

t2.start();

t3.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

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

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

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.

G

Já tentou algo assim?

Filho f1 = new Filho();

Thread t1 = new Thread (f1);

Thread t2 = new Thread (f1);

Thread t3 = new Thread (f1);
t1.start();

t2.start();

t3.start();
E

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

Valeu pela ajuda !!

Criado 10 de setembro de 2007
Ultima resposta 11 de set. de 2007
Respostas 7
Participantes 4