Este artigo apresenta os principais recursos da linguagem Java para o desenvolvimento de aplicações com linhas de execução concorrentes, abrangendo sincronização de sessões críticas, criação de linhas de execução adicionais com threads, o uso de classes auxiliares, entre outros.
Tais recursos são acessíveis sob uma sintaxe simplificada e moderna, sem perder em eficiência nem legibilidade.
É apresentada também uma aplicação exemplo multi-thread que utiliza muitos dos recursos de concorrência, incluindo a implementação de semáforos disponibilizada pela linguagem Java. Em aplicações práticas, a correta sincronização de programas concorrentes pode evitar problemas sérios e difíceis de serem detectados.
Para exemplificar a aplicação de soluções possíveis para problemas de sincronização, é proposta uma aplicação exemplo baseada numa interface gráfica que utiliza tais funcionalidades para garantir a sincronia no acesso a recursos compartilhados.
Vamos abordar nesse artigo as principais classes e comandos da linguagem Java para se trabalhar com linhas de execução adicionais pertencentes ao mesmo programa, que são conhecidas como threads.
Cada aplicação Java já contém um threads por padrão, que é o thread principal da própria aplicação, porém outras linhas de execução adicionais podem ser criadas para realizar tarefas simultâneas.
Um exemplo de aplicação multi-thread clássico é um servidor de chat, onde vários clientes podem se conectar a ele usando sockets, causando a realização de diversas tarefas simultaneamente, como criação de novas conexões, fechamento de conexões existentes, gerenciamento de interface gráfica, realização de backup, envio e recebimento de mensagens para cada cliente e outros.
Usando threads, evitamos o caso de paralisar o servidor toda vez que uma dessas requisições precisar ser atendida, pois cada uma dessas tarefas é realizada ao mesmo tempo.
No dia a dia é comum usar aplicações que envolvam threads, como aplicações com interfaces gráficas (GUIs) e aplicações de comunicação. Em tais aplicações são executadas diversas tarefas simultaneamente por linhas de execução paralelas, onde o sistema operacional designa threads aos processadores durante intervalos de tempo que ele mesmo determina.
Felizmente, Java oferece recursos de alto nível que escondem a verdadeira complexidade do tratamento de threads no nível do sistema operacional e do hardware, permitindo ao desenvolvedor se focar no desenvolvimento da correta sincronização do uso de recursos compartilhados por threads através do uso de comandos simples e eficazes.
Um problema que pode prejudicar aplicações multi-thread se não tratado corretamente é a sincronização do acesso a recursos compartilhados, mais comumente caracterizados na forma de variáveis e objetos.
Portanto, em muitas vezes, organizações são prejudicadas por utilizarem software que contém falhas no controle de acesso a recursos compartilhados, levando a problemas como o caso da aplicação tentar criar registros no banco de dados com violação de unicidade de chaves únicas, perda de dados, erros esporádicos na aplicação, lentidão excessiva do sistema, entre outros.
Na maioria das linguagens de programação, não é uma atividade trivial desenvolver um programa multi-thread que apresenta sincronização eficiente de acesso a recursos compartilhados por tais threads, porém, na linguagem Java, são disponibilizadas uma série de classes, comandos e métodos a fim de facilitar o controle de acesso a tais recursos, liberando o programador de precisar vincular fortemente a lógica da aplicação ao controle de threads, aumentando a legibilidade do código-fonte, além de sua eficiência.
Disputa de sessões críticas
Um problema muito comum que pode ocorrer na programação concorrente é a atualização de uma variável compartilhada entre vários threads. Na Listagem 1 considere o trecho de código apresentado como sendo uma sessão crítica, ou seja, como sendo um trecho de código com variáveis que são visíveis e acessíveis para mais de um threads.
x = x + y; y = x + y + 1;
Se considerarmos que a sessão crítica na listagem é executada somente por um único thread, sempre ...
Desbloqueie toda a DevMedia
-
+2000 artigos e vídeos
-
+40 trilhas sobre Front-end, Back-end, IA e muito mais
-
+5000 exercícios práticos
-
Mentorias ao vivo individuais
Confira outros conteúdos:
Introdução ao JDBC
Novidades do Java
Teste unitário com JUnit
Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.