mais uma questão do exame sobre threads  XML
Índice dos Fóruns » Certificação Java
Autor Mensagem
ana_abrantes
JavaGuru
[Avatar]

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
bLaCkWiZaRd
JavaChild
[Avatar]

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!!!
[MSN] [ICQ]
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?)
ana_abrantes
JavaGuru
[Avatar]

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
bLaCkWiZaRd
JavaChild
[Avatar]

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!!!
[MSN] [ICQ]
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...
brlima
Moderador
[Avatar]

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
[MSN]
Ironlynx
Moderador
[Avatar]

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/
[WWW]
ana_abrantes
JavaGuru
[Avatar]

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
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?
brlima
Moderador
[Avatar]

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
[MSN]
ana_abrantes
JavaGuru
[Avatar]

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
 
Índice dos Fóruns » Certificação Java
Ir para:   
Powered by JForum 2.1.8 © JForum Team