Threads, Locks e Sincronização em Java
Classificado em Computação
Escrito em em
português com um tamanho de 3,15 KB
Execução de Servidor Multithread em Java
A execução de um servidor que atende múltiplos clientes simultaneamente ocorre da seguinte forma:
- O servidor cria um socket na porta 5000.
- Aguarda uma conexão de algum cliente.
- Ao receber um pedido de conexão, ele a aceita.
- Dispara uma nova thread para o tratamento de mensagens do cliente.
- Esta thread, primeiramente, recebe o nome (nickname) do cliente. Este nome não pode ser nulo, já que um nome vazio indica ao servidor que o cliente se desconectou.
- Em seguida, armazena o socket do cliente no seu vetor de clientes ativos para o repasse de mensagens.
- A seguir, lê as mensagens enviadas pelo cliente e as repassa aos demais clientes conectados através do método
sendToAll. - Ao detectar uma mensagem nula, o servidor informa aos demais clientes que este se desconectou, removendo-o do vetor de clientes ativos.
Exemplo de Método Remoto em Java
public int somar(int a, int b) throws RemoteException {
return a + b;
}Sincronização de Threads e Regiões Críticas
O recurso de Threads é muito importante quando é necessário manter o sincronismo entre diferentes processos executados concorrentemente, como no algoritmo do produtor/consumidor, onde um processo produz um dado e outro o consome.
Técnica de Lock/Unlock
A técnica de sincronização lock/unlock possibilita assegurar o acesso exclusivo (leitura e escrita) a um recurso compartilhado por duas ou mais entidades. Isso previne problemas de condições de disputa em regiões críticas.
while(true) {
tarefa;
lock();
c = c + 1;
unlock();
}Bloco synchronized
Com o bloco synchronized, o objeto fica preso à thread, ou seja, ela obtém o bloqueio do objeto. Enquanto não libertar esse lock (enquanto não sair do bloco), todas as outras threads que quiserem aceder ao objeto terão de esperar. Isso gera um efeito exclusivo e bloqueador:
- Exclusivo: porque só uma thread pode ter o objeto por vez.
- Bloqueador: porque as outras que quiserem aceder têm de esperar.
Assim que uma thread entra no bloco synchronized, mais nenhuma o pode fazer enquanto essa não sair.
synchronized public int getComVC() throws InterruptedException {
int r;
while (full == 0) wait();
r = buffer[inicio];
inicio = (inicio + 1) % N;
full--;
notifyAll();
return r;
}Métodos de Controle de Threads
Método join()
Com o método join(), a thread atual só continua sua execução depois que a outra thread finalizar toda a sua execução.
Método notifyAll()
O método notifyAll() acorda todas as threads que estejam à espera de que um objeto fique livre.