| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 20/05/2004 16:24:40
|
ana_abrantes
JavaGuru
![[Avatar]](/images/avatar/c8b958be3f6282eb1e3fa.gif)
Membro desde: 29/08/2003 15:44:09
Mensagens: 238
Localização: São Paulo
Offline
|
Acabei de lembrar de mais uma questão (que eu acertei!):
public class SyncTest {
private int x;
private int y;
private synchronized viod setX( int i ) { x =1 ;}
private synchronized viod setY( int i ) { y =1 ;}
public void setXY ( int i ) { setX(i); setY(i);}
public synchronized boolean check() { return x!=y ; }
}
Under which conditions will check() return 'true' when called from a different class ?
a) check() can never return true
b) check() can return true when setXY is called by multiple threads
c) check() can return true when multiple threads call setX & setY seperately
d) check() can only return true if SyncTest is changed to allow x & y to be set seperately.
|
Ana
SCJP 1.4 - SCWCD 1.4 |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 20/05/2004 16:30:42
|
bLaCkWiZaRd
JavaChild
![[Avatar]](/images/avatar/c6010ce83fbe05c59a51b.jpg)
Membro desde: 24/09/2002 22:53:16
Mensagens: 125
Localização: Marília - São Paulo
Offline
|
Não so nenhum perito em threads e não sei se entendi bem a questão, mas a resposta seria a -> d
|
It's not Black! It's not White! it's the Blues!!!! Wine Blues onde vinho é música!!! >P Rotina? Só se for em C!!! |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 20/05/2004 16:51:50
|
EddiE
Virtual Machine Man
Membro desde: 31/08/2002 09:05:07
Mensagens: 647
Localização: São Paulo - SP
Offline
|
x e y não foram inicializados (são automaticamente) então pode haver algum momento que x e y ainda são iguais a 0 e depois inicializados com 1 pelos métodos setX() e setY().
setXY() é pública, várias linhas podem acessar ao mesmo tempo e haverá a possibilidade do retorno ser true.
(estou certo?)
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 20/05/2004 16:56:34
|
ana_abrantes
JavaGuru
![[Avatar]](/images/avatar/c8b958be3f6282eb1e3fa.gif)
Membro desde: 29/08/2003 15:44:09
Mensagens: 238
Localização: São Paulo
Offline
|
a resposta D está errada!
Tente novamente...
|
Ana
SCJP 1.4 - SCWCD 1.4 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 20/05/2004 16:59:54
|
bLaCkWiZaRd
JavaChild
![[Avatar]](/images/avatar/c6010ce83fbe05c59a51b.jpg)
Membro desde: 24/09/2002 22:53:16
Mensagens: 125
Localização: Marília - São Paulo
Offline
|
imaginei... preciso estudar mais threads
|
It's not Black! It's not White! it's the Blues!!!! Wine Blues onde vinho é música!!! >P Rotina? Só se for em C!!! |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 20/05/2004 17:09:21
|
wellmattos
Debugger
Membro desde: 05/12/2003 10:46:16
Mensagens: 57
Offline
|
A Resposta certa seria a "b" ? Porque como o metodo setXY não é synchronized e apenas os metodos setX e setY são teriamos o seguinte cenario:
Duas Threads chamam o método setXY... a primeira a chamar vai entrar no setX e setar o valor de x em 1.... a outra vai ficar esperando o metodo ser liberado.. quando ele for liberado a primeira thread vai chamar o setY e setar 1, enquanto a segunda thread vai chamar o setX e setar 2... nesse momento se uma terceira thread chamar o check() ele vai retornar true, pq o x é 2 e o y é 1...
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 20/05/2004 19:02:06
|
brlima
Moderador
![[Avatar]](/images/avatar/fc2c7c47b918d0c2d792a719dfb602ef.png)
Membro desde: 12/05/2003 14:03:38
Mensagens: 1537
Localização: São Paulo - SP
Offline
|
Eu acho que seria B e C... pois é o método que eh synchronized, entao ele pode finalizer o setX e o outro obter o lock pra setY, deixando diferente... Assim como o setXY nao eh synchronized, pode ser q duas thread alterem ao mesmo tempo um e outro, deixando diferente tb....
[editado] Retirem a C: métodos privados [/editado]
Am i right?
|
Bruno R. Lima
-------------------------------------------
flickr :: twitter |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 21/05/2004 00:47:17
|
Ironlynx
Moderador
![[Avatar]](/images/avatar/93d65641ff3f1586614cf2c1ad240b6c.jpg)
Membro desde: 02/05/2003 01:06:41
Mensagens: 3515
Localização: The other side of the screen
Offline
|
B.
|
Não basta persistir...tem que prevalecer!
Ironlynx
Anarquista de Sistemas
http://osereojava.blogspot.com/ |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 21/05/2004 08:20:20
|
ana_abrantes
JavaGuru
![[Avatar]](/images/avatar/c8b958be3f6282eb1e3fa.gif)
Membro desde: 29/08/2003 15:44:09
Mensagens: 238
Localização: São Paulo
Offline
|
Exatamente!
A correta é B porque setXY() não é sincronizado.
|
Ana
SCJP 1.4 - SCWCD 1.4 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 21/05/2004 09:07:48
|
EddiE
Virtual Machine Man
Membro desde: 31/08/2002 09:05:07
Mensagens: 647
Localização: São Paulo - SP
Offline
|
No Core Java há um parágrafo que diz que um método deve SEMPRE chamar sleep() para dar chance a outra linha de execução. Pelo que sempre ouvi falar duas linhas podem executar o mesmo método (senão synchronized não teria propósito).
sleep() seria apenas para dar mais uma chance para outra linha?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 21/05/2004 11:06:21
|
brlima
Moderador
![[Avatar]](/images/avatar/fc2c7c47b918d0c2d792a719dfb602ef.png)
Membro desde: 12/05/2003 14:03:38
Mensagens: 1537
Localização: São Paulo - SP
Offline
|
Se eu nao to enganado, o método yeld tb o faz.... yeld() abre mao do processo atual para dar chance a outro, mas nao pára, apenas volta ao estado de "proximo a executar"....
O sleep() volta pra inativo durante N milisegundos. Ateh q seu tempo acabe e ele disperte, entrando entao na fila para ser executado.
|
Bruno R. Lima
-------------------------------------------
flickr :: twitter |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 21/05/2004 11:09:25
|
ana_abrantes
JavaGuru
![[Avatar]](/images/avatar/c8b958be3f6282eb1e3fa.gif)
Membro desde: 29/08/2003 15:44:09
Mensagens: 238
Localização: São Paulo
Offline
|
Só que o sleep() não libera o lock do objeto, daí não vai dar a vez para outra thread.
wait() seria similar ao sleep() com a diferença de liberar o lock do objeto.
|
Ana
SCJP 1.4 - SCWCD 1.4 |
|
|
 |
|
|