Synchronized, Lock e Semaphore

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:

  1. Existe alguma situação pratica onde seja util/necessário usar 2 ou mais locks na mesma area?

  2. 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 :slight_smile:

Ocorre quando um objeto sincronizado chama um método também sincronizado.

É 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

Ocorre quando um objeto sincronizado chama um método também sincronizado.
[/quote]
Juro q tentei mas nao entendi :blush:
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 :slight_smile:

Valeu a intenção :slight_smile:

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