Olá, colegas!
[color=white]Antes de qualquer coisa: Eu pesquisei no fórum e nao achei nada perto do que procuro.
[/color]
Estou fazendo um trabalho e aparecem duas duvidas:
-
Existe alguma situação pratica onde seja util/necessário usar 2 ou mais locks na mesma area?
-
Que tipo de situação é mais adequado ultilizar Synchronized (wait/notify), Lock (await/signal) ou Semáforos? (sou obrigada a usar os três no mesmo trabalho)
Obrigada pela atenção e espero que futuramente essas respostas possam ser uteis para outros
Ocorre quando um objeto sincronizado chama um método também sincronizado.
[/quote]
Juro q tentei mas nao entendi
E bem…, eu tava perguntando uma situação real onde se precise fazer isso. Tipo, eu imagino q existe, mas nao consigo pensar em nada
É mais fácil ler os javadocs da linguagem, que fornecem explicações detalhadas:
http://download.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/locks/Lock.html
http://download.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Semaphore.html
E esse artigo do Brian Goetz:
http://www-106.ibm.com/developerworks/java/library/j-jtp10264[/quote]
Esses primeiros, e também outros da biblioteca, ja tentei ler, mas aquilo que eu entendi não me ajudou muito (muito inglish hard level pra mim). Não dizia que tipo de situação é melhor um, qual outro (ignorando o fator múltiplos locks, que nao vou usar)
Esse ultimo vou tentar ler, espero que ajude
Valeu a intenção
Poxa, é que é meio difícil te dar um exemplo sem algumas páginas de textos.
Concorrência é mesmo um assunto complicado. =/
A vantagem do Semáforo sobre o Lock é que ele permite que várias threads entrem num trecho semaforizado antes de haver a trava. É muito útil para obtenção de tokens. Por exemplo, considere que seu banco de dados pode rodar até 5 statements simultâneos. Você poderia ter um semáforo que permitisse 5 threads solicitarem um statement:
[code]private Semaphore semaphore = new Semaphore(5);
public Statement createStatement() {
semaphore.acquire();
return connection.createStatement();
}
public void release() {
semaphore.release();
}[/code]
O código do exemplo está rudimentar. Na prática haveriam mais alguns mapas, e coisas do tipo.
O lock tem mais tipos de sincronização que o bloco sinchronized simples. Dê uma olhada na ReadWriteLock, que é um desses tipos diferentes. Isso permite que você tenha sincronização mais flexível.
A vantagem do synchronized é, definitivamente, sua simplicidade e a garantia de que você nunca esquecerá de liberar o bloco sincronizado. Note que para o uso correto, o lock deve estar num bloco try…finally. Isso é simplesmente desnecessário com o synchronized.
Muito obrigada, Vini, essas informações ja deram um up nos meus planos.
Vou complementar, para os futuros acessadores, o q o prof disse hoje:
-> Para usar Sync E Lock, o projeto tem q ter no minimo 2 objetos compartilhados <-
Eu nem havia me ligado nisso, sorte q meu banco tem contas correntes e poupança XD