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.
Não so nenhum perito em threads e não sei se entendi bem a questão, mas a resposta seria a -> [color=“red”]d[/color] :?:
E
EddiE
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?) :?
A
ana_abrantes
a resposta D está errada!
Tente novamente…
bLaCkWiZaRd
imaginei… preciso estudar mais threads
W
wellmattos
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
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 :oops: [/editado]
Am i right? :roll:
Ironlynx
B.
A
ana_abrantes
Exatamente!
A correta é B porque setXY() não é sincronizado.
E
EddiE
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
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.
A
ana_abrantes
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.