Synchronized, Lock e Semaphore

4 respostas
Aramati

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:

4 Respostas

ViniGodoy

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

Aramati

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

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

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:

ViniGodoy

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:

private Semaphore semaphore = new Semaphore(5);

public Statement createStatement() {
   semaphore.acquire();
   return connection.createStatement();
}

public void release() {
   semaphore.release();
}

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.

Aramati

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

Criado 11 de março de 2011
Ultima resposta 18 de mar. de 2011
Respostas 4
Participantes 2