| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 05/02/2010 17:17:06
|
TiagoTC
JavaTeenager
Membro desde: 09/02/2008 01:12:58
Mensagens: 189
Offline
|
Mais uma da série "por que o compilador não detecta isso?"
O código compila normal, mas o problema é que o lock da variável t não foi adquirido então vai gerar a exceção IllegalMonitorStateException. Mas como o compilador não consegue ver isso? Pra mim seria fácil, bastava o compilador ver se a instrução "t.wait()" está dentro de um bloco "synchronized(t)".
|
Pérola: "Nunca coloque seu celular em um forno de microondas, pois isso faz com que a bateria exploda" - Manuais de telefones celulares |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 05/02/2010 17:25:48
|
rodrigo.bossini
GUJ Master
![[Avatar]](/images/avatar/3b6fe2dc98ceed6e1608e7cfc662ab11.jpg)
Membro desde: 01/07/2008 20:59:17
Mensagens: 1055
Offline
|
TiagoTC wrote: Pra mim seria fácil, bastava o compilador ver se a instrução "t.wait()" está dentro de um bloco "synchronized(t)".
É muito fácil para o compilador ver se a variável de referência usada no synchronized é a mesma usada para chamar o wait.
Mas o compilador não tem como saber se o objeto referenciado por t no momento em que synchronized (t) foi executado é o mesmo que t referencia quando wait é chamado em t.
Exemplo:
E se ao invés de fazer o=t eu fizesse o=u? Como é que o compilador vai saber que o objeto não é mais o mesmo?
|
http://www.rodrigobossini.com.br/
Meu Twitter:@rodrigobossini Se uma pessoa fala português há 30 anos e ainda não aprendeu, por que é que vou acreditar que ela está programando em alguma linguagem de programação há apenas 10 anos e sabe o que está fazendo? |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 05/02/2010 17:29:19
|
rmendes08
GUJ Master
![[Avatar]](/images/avatar/9ee855f3ce4dd40182183463232e2162.jpg)
Membro desde: 29/05/2008 14:09:28
Mensagens: 1616
Offline
|
Bem, isso seria um desastre, pois você somente poderia colocar uma chamada a wait no mesmo escopo de um bloco synchronyzed. Além do mais, essa não é a única possibilidade de uso do método wait. O fato, é que isso não é responsabilidade do compilador. O compilador trabalha somente até o nível sintático da linguagem, e não no nível semântico. Para o compilador, t.wait() é uma chamada a um método como qualquer outra.
|
"A Técnica é transformada em Arte por quem a emprega"
"O futuro pertence àqueles que acreditam na beleza de seus sonhos"
Computadores Fazem Arte
http://www.uaijug.com.br
"É importante estabelecer uma estrutura de alto nível, mas isso não significa criar uma infinidade de diagramas de classes detalhados." |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 05/02/2010 17:48:48
|
TiagoTC
JavaTeenager
Membro desde: 09/02/2008 01:12:58
Mensagens: 189
Offline
|
rmendes08 wrote:Bem, isso seria um desastre, pois você somente poderia colocar uma chamada a wait no mesmo escopo de um bloco synchronyzed. Além do mais, essa não é a única possibilidade de uso do método wait. O fato, é que isso não é responsabilidade do compilador. O compilador trabalha somente até o nível sintático da linguagem, e não no nível semântico. Para o compilador, t.wait() é uma chamada a um método como qualquer outra.
rmendes08, mas quando o compilador, por exemplo, verifica se um método A está ou não capturando uma checked exception (ou jogando-a para frente com o throws) não é nível semântico? Pq a sintaxe está perfeita... mas ainda sim o compilador detecta que está faltando capturar ou lançar a exceção.
Essas coisas que geram dúvidas em mim sobre o que o compilador pode ou não detectar.
Mas, no caso da pergunta desse tópico, já entendi a resposta pela explicação do rod.attack.
|
Pérola: "Nunca coloque seu celular em um forno de microondas, pois isso faz com que a bateria exploda" - Manuais de telefones celulares |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/02/2010 21:33:36
|
LPJava
GUJ Hacker
Membro desde: 18/04/2006 12:50:23
Mensagens: 5524
Localização: Bahia/Porto Alegre
Offline
|
http://imasters.uol.com.br/artigo/8787/java/mais_um_pouco_sobre_threads_em_java/
dar uma olhada, para ver se ajuda o por que da sua situacao.
|
Sun Certified Java Programmer 5.0
Blog:http://www.camilolopes.com
Twitter:www.twitter.com/camilolope
Linkedin: http://br.linkedin.com/in/camilolopes
Curso online OCPJP: http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp
Autor livro Guia SCJP & JEE c/ Frameworks: http://blog.camilolopes.com.br/livrosrevistaspalestras/
|
|
|
 |
|
|