métodos syncronized  XML
Índice dos Fóruns » Certificação Java
Autor Mensagem
elvishr
JavaChild
[Avatar]

Membro desde: 01/04/2003 00:47:21
Mensagens: 117
Localização: Brasília/DF
Offline

Pessoal, seguinte, se eu tenho vários threads acessando um método syncronized.
Quando algum thread em execução obtêm o acesso ao método, ele é bloqueado ao thread atual, de forma que os outros não o podem acessar, correto?
Minha dúvida é se isso sempre ocorre assim? Existe alguma exceção para dois threads acessarem um método syncronized??
Se o thread obtiver o bloqueio e for suspenso, tipo, por um sleep, ou yield, os outros threads obtem acesso ao método?? independente do tempo q este ficou suspenso?? ou nada é garantido??

Elvis não morreu
SCJP 1.4
SCWCD 5.0
SCBCD 5.0
JBCAA
[ICQ]
danieldestro
Moderador
[Avatar]

Membro desde: 04/09/2002 17:26:16
Mensagens: 6667
Localização: São Paulo / Catanduva
Offline

O acesso ao método só é liberado (ser for sync) assim que o método que possui o acesso, terminar de executa-lo.

gotjava?
Doe sangue
What You See Is What You Get!
Apostilas de Java grátis!
RefsCALL - Bandeira Eletrônica para Árbitro de Futebol
[WWW]
ana_abrantes
JavaGuru
[Avatar]

Membro desde: 29/08/2003 15:44:09
Mensagens: 238
Localização: São Paulo
Offline

sleep() não libera o lock do objeto, já o wait() sim.

yield() passa a vez para outra thread, mas não é garantido que funcione desta maneira pois é a JVM que escolhe qual thread vai executar, portanto uma thread pode ficar executando infinitamente mesmo chamando yield().

Ana

SCJP 1.4 - SCWCD 1.4
danieldestro
Moderador
[Avatar]

Membro desde: 04/09/2002 17:26:16
Mensagens: 6667
Localização: São Paulo / Catanduva
Offline

Ao invés da JVM, não é o SO quem escolhe?

gotjava?
Doe sangue
What You See Is What You Get!
Apostilas de Java grátis!
RefsCALL - Bandeira Eletrônica para Árbitro de Futebol
[WWW]
elvishr
JavaChild
[Avatar]

Membro desde: 01/04/2003 00:47:21
Mensagens: 117
Localização: Brasília/DF
Offline

Ok Ana, então com sleep() as outras threads não obtêm lock ao objeto, e sim com wait().

Agora, não entendi. Quando eu chamo yield para uma thread que está em um metodo sync, depende da JVM se ela vai liberar o lock ou não ?? isso mesmo ??

Elvis não morreu
SCJP 1.4
SCWCD 5.0
SCBCD 5.0
JBCAA
[ICQ]
phstc
JavaGuru

Membro desde: 13/04/2004 12:22:22
Mensagens: 200
Localização: São Paulo, SP
Offline

o yield(), não e mais ou menos assim, da um sleep() na thread se tiver algum Thread na espera da chave, caso não tenha ele continua executando?
[Email]
brlima
Moderador
[Avatar]

Membro desde: 12/05/2003 14:03:38
Mensagens: 1537
Localização: São Paulo - SP
Offline

Pera...
Vc chama um método sync DENTRO de uma Thread.. e nao o controario

Qdo vc chamou um método que eh sync de uma thread A, e, enquanto A executa esse método, vc atravez da thread B chama o mesmo método, B espera A terminar para começar. Ok situação pronta.

dar sleep dentro de A, nao faz com que seja liberado para B, portanto B contiar esperar A temrinar.

dar yield nao garante que B seja a proxima a ser chamado.

dar wait libera o método para B, deixando A aguardando que alguem dispare um notify para continuar.

Acho que é isso.. correções por favor

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

elvishr wrote:Ok Ana, então com sleep() as outras threads não obtêm lock ao objeto, e sim com wait().

Agora, não entendi. Quando eu chamo yield para uma thread que está em um metodo sync, depende da JVM se ela vai liberar o lock ou não ?? isso mesmo ??


Com relação a yield(), quando uma thread o chama, simplesmente pára de executar e volta para a fila, com isso acredito que o lock é liberado senão não teria sentido. Mas isso eu não tenho certeza, não, estou supondo.
O que sei sobre yield() é que ele é uma maneira de não deixar uma thread só ficar rodando o tempo todo e dar chance para as outras, só que isso depende da JVM e pode ou não depender das prioridades que elas têm, mas nada é garantido.

Ana

SCJP 1.4 - SCWCD 1.4
brlima
Moderador
[Avatar]

Membro desde: 12/05/2003 14:03:38
Mensagens: 1537
Localização: São Paulo - SP
Offline

eu lembro de ter estudado chamando yield() de fora de um método sync... Agora chamando de dentro de um método sync num tenho a menor ideia do que acontece...rssss...

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

phstc wrote:o yield(), não e mais ou menos assim, da um sleep() na thread se tiver algum Thread na espera da chave, caso não tenha ele continua executando?


É... não se dá um sleep() numa thread...

Não vi em lugar algum dizendo que yield() chama sleep(), não.

A thread que chamou yield() pára de executar e vai para o estado de runnable esperando por sua vez na fila.
Daí, entre todas que estão em runnable, uma é escolhida para executar e pode ser a mesma.
Mas isso não tem a ver com locks, mesmo porque quando um lock é liberado não é garantido que uma thread que está esperando por ele vai executar imediatamente.

Ana

SCJP 1.4 - SCWCD 1.4
ana_abrantes
JavaGuru
[Avatar]

Membro desde: 29/08/2003 15:44:09
Mensagens: 238
Localização: São Paulo
Offline

brlima wrote:eu lembro de ter estudado chamando yield() de fora de um método sync... Agora chamando de dentro de um método sync num tenho a menor ideia do que acontece...rssss...


Também não vi isso, seria meio estranho e acredito que esse tipo de coisa não cai no exame.

Ana

SCJP 1.4 - SCWCD 1.4
kuchma
Moderador
[Avatar]

Membro desde: 17/01/2003 19:36:16
Mensagens: 1231
Localização: Curitiba - PR
Offline

ana_abrantes wrote:Com relação a yield(), quando uma thread o chama, simplesmente pára de executar e volta para a fila, com isso acredito que o lock é liberado senão não teria sentido. Mas isso eu não tenho certeza, não, estou supondo.


Estava com essa duvida tambem - o unico metodo que libera os locks eh o wait... yield, sleep, join e mesmo o notify mantem os locks.


Marcio Kuchma
[WWW] [ICQ]
pcalcado
Moderador
[Avatar]

Membro desde: 08/03/2004 17:19:35
Mensagens: 5174
Localização: Sydney - Australia
Offline

danieldestro wrote:Ao invés da JVM, não é o SO quem escolhe?



Uhm... ao que aprece, a JVM implementa umas Threads virtuais [o Gosling disse na ACM Queue que eles tiveram problemas com mais de 10.000 threads] , então acho que é a JVM mesmo...

[]s

Phillip Calçado "Shoes"
http://fragmental.tw/
http://blog.fragmental.com.br/
"It is unfortunate that much of what is called 'object-oriented programming today is simply old style programming with fancier constructs." - Alan Kay
[Email] [WWW] [Yahoo!] [MSN]
 
Índice dos Fóruns » Certificação Java
Ir para:   
Powered by JForum 2.1.8 © JForum Team