[Resolvido]Threads

8 respostas
S

Boa tarde a todos, eu passei o dia todo tentando melhorar meu ponto mais fraco em Java: threads.

Entendi bem as coisas, passei por alguns tópicos aqui do GUJ como http://www.guj.com.br/java/53187-wait-e-notify-duvida--resolvido (parabens pelos aniversarios) mas ainda algumas coisas não ficaram claro na minha cabeça.

Primeiro:

Qual a diferença entre:

void synchronized metodo() {
//resto do codigo
}

e

void metodo() {
     synchronized(this) {
		//resto do codigo	
     }
}

?

E a segunda duvida é:

Quando você usa

synchronized(meuObjeto) {
     }

Significa que enquanto alguma Thread estiver dentro do bloco synchronized ninguém tem acesso a aquele objeto correto?

8 Respostas

rmendes08

Para efeitos práticos, nenhuma.

Não. Significa que apenas 1 thread adentrará a região crítica sincronizada por meuObjeto. Qualquer outra thread que não delimite uma região crítica poderá usar o objeto normalmente.

S

rmendes08:
Sem_Nome:

Qual a diferença entre:

void synchronized metodo() {
//resto do codigo
}

e

void metodo() {
     synchronized(this) {
		//resto do codigo	
     }
}

?

Para efeitos práticos, nenhuma.

Não. Significa que apenas 1 thread adentrará a região crítica sincronizada por meuObjeto. Qualquer outra thread que não delimite uma região crítica poderá usar o objeto normalmente.

Obrigado pela atenção.

Eu não entendi bem a explicação para a segunda pergunta.

ivandasilva

Na boa, para mim tem diferença

void synchronized metodo() {  
//resto do codigo  
}
void metodo() {  
     synchronized(this) {  
        //resto do codigo     
     }  
}

O primeiro sincroniza todo o método ou seja coloca um bloqueio no método inteiro e faz com que somente uma Thread de cada vez possa acessar o metódo, o segundo sincroniza apenas um trecho do código, sendo que no método você pode ter vários passos antes e vários passos depois do synchronized… eu acredito que essa seja uma das formas de você não deixar a sua aplicação lenta…

e pelo que eu vi o

synchronized(meuObjeto) {  }

é parecido com o

synchronized(this) {  }

mas, no segundo você está sincronizando a instância e não um obj de uma instância…

S

ivandasilva:
Na boa, para mim tem diferença

void synchronized metodo() {  
//resto do codigo  
}
void metodo() {  
     synchronized(this) {  
        //resto do codigo     
     }  
}

O primeiro sincroniza todo o método ou seja coloca um bloqueio no método inteiro e faz com que somente uma Thread de cada vez possa acessar o metódo, o segundo sincroniza apenas um trecho do código, sendo que no método você pode ter vários passos antes e vários passos depois do synchronized… eu acredito que essa seja uma das formas de você não deixar a sua aplicação lenta…

e pelo que eu vi o

synchronized(meuObjeto) {  }

é parecido com o

synchronized(this) {  }

mas, no segundo você está sincronizando a instância e não um obj de uma instância…

No segundo exemplo da primeira pergunta eu estou sincronizando o metodo inteiro. Só queria saber se existia diferença entre sincronizar o metodo todo assim e sincronizar pela assinatura.

rmendes08

Se você sincronizar o método todo, usando this como monitor então não há diferença.

S

rmendes08:

No segundo exemplo da primeira pergunta eu estou sincronizando o metodo inteiro. Só queria saber se existia diferença entre sincronizar o metodo todo assim e sincronizar pela assinatura.

Se você sincronizar o método todo, usando this como monitor então não há diferença.

Entendo.

Em relação a segunda pergunta:

Quando alguma Thread chegar em

synchronized(meuObjeto) { }

Caso exista alguma outra Thread em algun bloco sincronizado do meuObjeto, ele terá que esperar aquela Thread sair do synchronized para que ele possa entrar correto?

rmendes08

Sem_Nome:

Em relação a segunda pergunta:

Quando alguma Thread chegar em

synchronized(meuObjeto) { }

Caso exista alguma outra Thread em algun bloco sincronizado do meuObjeto, ele terá que esperar aquela Thread sair do synchronized para que ele possa entrar correto?

Exatamente.

S

rmendes08:
Sem_Nome:

Em relação a segunda pergunta:

Quando alguma Thread chegar em

synchronized(meuObjeto) { }

Caso exista alguma outra Thread em algun bloco sincronizado do meuObjeto, ele terá que esperar aquela Thread sair do synchronized para que ele possa entrar correto?

Exatamente.

Compreendo.

Obrigado pela ajuda.

Criado 21 de setembro de 2012
Ultima resposta 21 de set. de 2012
Respostas 8
Participantes 3