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:

  1. O servidor cria um socket na porta 5000.
  2. Aguarda uma conexão de algum cliente.
  3. Ao receber um pedido de conexão, ele a aceita.
  4. Dispara uma nova thread para o tratamento de mensagens do cliente.
  5. 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.
  6. Em seguida, armazena o socket do cliente no seu vetor de clientes ativos para o repasse de mensagens.
  7. A seguir, lê as mensagens enviadas pelo cliente e as repassa aos demais clientes conectados através do método sendToAll.
  8. 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.

Entradas relacionadas: