Uma de threads (locks)

9 respostas
D

vejam essa:

Consider the following method:

public void getLocks(Object a, Object b) { synchronized(a) { synchronized(b) { //do something } } }

and the following instantiations:

Object obj1 = new Object();
Object obj2 = new Object();

obj1 and obj2 are accesible to two different threads and the threads are about to call the getLocks() method.
Assume the first thread calls the method getLocks(obj1, obj2).

Which of the following is true?

Options

Select 1 correct option.

The second thread should call getLocks(obj2, obj1)

The second thread should call getLocks(obj1, obj2)

The second thread should call getLocks() only after first thread exits out of it.

The second thread may call getLocks() any time and passing parameters in any order.

None of the above.

:wink:

9 Respostas

P

Nossa eu nunca vi esse tipo de construcao, vou pegar o livro e tento responder.

bLaCkWiZaRd

Seria a terceita opção???
pois como a e b sao sincronizadas ele só poderá acessar b quando a primeira chamada tiver liberado a ???

espero não estar falando bobagens, estou começando a estudar threads agora =PPP

Rafael_Nunes
O método pode ser chamado por ambas as threads pois ele não é sincronizado, somente um bloco interno dele. E os objetos podem ser passados em qualquer ordem, sendo que o método recebe dois objetos.


 certo? Ou falei besteira?

O método pode ser chamado por ambas as threads pois ele não é sincronizado, somente um bloco interno dele. E os objetos podem ser passados em qualquer ordem, sendo que o método recebe dois objetos.

Tá certo? Ou falei besteira?

P

Eu também acho que é a terceira opção, mais uma dúvida sobre esta construção, não entendi muito bem, o que muda nisto?

public metodo(Object a) { synchronized(a) { int x = 0; System.out.println(++x); } }

para isso:

public metodo(Object a) { synchronized(this) { int x = 0; System.out.println(++x); } }

para isso:

synchronized public metodo(Object a) { int x = 0; System.out.println(++x); }

elvishr

Não seria a segunda opção ??

Como a é syncronized, ele ficará esperarando o lock do objeto.

brlima

acho que eh a quarta opção: tanto faz qdo ou a ordem passada, ele vai funfa do mesmo jeito, soh vai ficar esperando o anterior liberar para continuar :smiley:

elvishr

:?: E ae Duque? qual é a resposta certa ??

P

E ai, cadê a resposta???

Jupter

acho que a resposta certa seria

como a primeira thread chama getLocks passando obj1 e obj2 nesta ordem, e não há garantia de que a primeira thread irá terminar de executar o getLocks antes de passar a execução para outra thread, a primeira thread pode ser interrompida antes de executar synchronized(b), assim, obj1 está “lockado” na primeira thread.

Se vc inverter os parâmetros na segunda thread, passando obj2 e obj1, getLocks irá rodar synchronized(a=obj2) e assim que tentar rodar synchronized(b=obj1), obj1 estará “lockado” na primeira thread.

acho que é isso.

Criado 11 de maio de 2004
Ultima resposta 9 de jun. de 2004
Respostas 9
Participantes 7