Java 8: Conheça os recursos para a programação concorrente
Aprenda com esse artigo a utilizar as melhorias da biblioteca de concorrência do Java 8 e aprimore o desempenho e a qualidade de suas aplicações.
ArtigosJavaJava 8: Conheça os recursos para a programação concorrente
Por que eu devo ler este artigo:Este artigo visa apresentar as melhorias adicionadas na JSR 166 – Concurrency Utilities na versão 8 da linguagem Java. Essa JSR oferece uma API para programação concorrente através de abstrações de alto nível, algo extremamente útil e bem-vindo, pois esse tipo de programação é complexo e sujeito a muitas falhas. Desse modo, será apresentado como utilizar os novos recursos da API a fim de tornar mais simples, intuitiva e assertiva a tarefa de criar blocos de código concorrentes, artefatos tão comuns no dia a dia de muitos desenvolvedores.
A programação concorrente
sempre foi sinônimo de desafio para grande parte dos desenvolvedores. Nesse
contexto, muitos consideram que a programação orientada a objetos e a
programação concorrente, depois de muito estudo e prática, deixam de ser algo
tão complicado. Para a primeira, certamente a afirmação é coerente, mas como
veremos ao longo do artigo, para a segunda existem controvérsias.
Quando um desenvolvedor
precisa de uma nova linha de execução concorrente (thread), o máximo que ele
pode fazer é criar e solicitar a execução da thread. Essa solicitação é então
enviada ao escalonador, agente de baixo nível, geralmente do sistema
operacional, que é responsável por coordenar a execução das threads. Tal agente
é o único que tem o poder de determinar quando uma thread irá para a CPU para
executar suas tarefas e por quanto tempo permanecerá lá. Portanto, a execução
de threads, por natureza, é algo imprevisível; não há como determinar de
antemão quando uma thread irá executar e por quanto tempo. Essa
imprevisibilidade aumenta consideravelmente a complexidade de sistemas que
utilizam threads, tornando difícil seu teste e a assertividade de seu processamento.
Além disso, problemas como
deadlocks (vide BOX 1), que fazem com que duas ou mais threads
fiquem bloqueadas “eternamente”, e o aumento de contenção, situação em que
muitas threads tentam acessar uma mesma área de memória simultaneamente e
apenas uma delas consegue o acesso, podem levar a inconsistências ou queda de
desempenho, se não evitados ou tratados adequadamente.
BOX 1. Deadlock Condição em que uma thread
bloqueia um recurso X e precisa de um recurso Y para finalizar. Contudo, o
recurso Y também está bloqueado por outra thread, que aguarda pelo recurso X
para executar seu processamento.
Assim, algo que parece
benéfico pode, subitamente, se tornar prejudicial. No entanto,
independentemente disso, threads são inevitáveis. Imagine um servidor web que
atenda apenas a uma requisição por vez (monothread). Em termos de
eficiência, o desempenho de tal servidor seria pobre para o usuário, pois em
situações em que o servidor receber vários acessos simultâneos pode se formar
uma fila de espera na qual apenas uma requisição será atendida por vez, pela
única thread que ele possui.
Já um servidor multithreading possibilita o atendimento
a diversas requisições simultaneamente, o que é muito interessante em termos de
experiência para o usuário. Esse e outros benefícios de um software multithreading se estendem tanto aos
usuários quanto ao próprio sistema. Como exemplo, considere um programa leitor
e transmissor de e-mails, no qual é possível receber e-mails enquanto outro
está sendo redigido pelo usuário, sem que uma ação precise esperar a outra para
acontecer. Junto a isso, há também um melhor uso dos recursos de hardware, pois
com mais threads é possível deixar o sistema realizando alguma tarefa que
independe de uma ação do usuário, mas que seja útil para o mesmo, como apagar
e-mails que estejam na lixeira por mais de um mês.
O uso de threads leva a um
modelo de programação conhecido como programação concorrente. Esse modelo é
diferente de programas monothread,
pois visa lidar com situações que, claro, não acontecem quando se tem apenas
uma thread em execução. Por exemplo, considere uma situação em que uma variável
precisa ter seu valor somado a 1 por cada thread ativa em um programa a cada um
segundo. Se as threads ativas fizerem essa soma simultaneamente, o valor dessa
variável poderá ficar inconsistente, pois, como dito, não há certeza de quando
uma thread irá executar e nem por quanto tempo. Assim, há chances de uma thread
ler o valor da variável e ser interrompida pelo escalonador logo após essa leitura,
a thread seguinte ler o mesmo valor da thread anterior e, consequentemente, as
duas somarem 1 ao mesmo valor da variável, o que tornaria o resultado
inconsistente. Note que em um programa monothread
esse problema não aconteceria.
Para evitar o problema de
inconsistência na soma do exemplo citado, alguma abordagem especial deve ser
aplicada, como bloquear o acesso à variável que mantém a soma e conceder a
apenas uma thread por vez o acesso. No entanto, as diferentes abordagens
necessárias em ambientes multithreading
não são simples de aplicar. O bloqueio à variável, por exemplo, é algo bem
complicado de construir. Para se ter uma ideia, imagine: como evitar que duas
thread obtenham o bloqueio simultaneamente?
Devido a isso, muitas
linguagens oferecem recursos nativos e bibliotecas complementares a fim de
facilitar a vida do desenvolvedor quando o mesmo precisa lidar com esses tipos
de situações. Em Java, essa biblioteca é formada por todas as interfaces,
classes, enums e demais itens contidos no pacote java.util.concurrent.
Esse pacote contempla a implementação da JSR 166 – Concurrency Utilities,
especificação da API para funcionalidades como bloqueios de acessos simultâneos
(locks), sincronizadores de threads, controlador de pool de threads,
coordenador de tarefas assíncronas, coleções concorrentes, variáveis atômicas,
entre outras.
Adicionada na versão 5 do
Java, essa biblioteca vem evoluindo bastante, e agora, com a versão 8, novas
melhorias foram feitas. Entre as mais significativas estão as novas propostas
para situações já atendidas na API, como um novo modelo de lock (bloqueio), uma
nova forma de coordenar tarefas assíncronas e uma nova abordagem para variáveis
atômicas.
A partir
do que foi comentado, ao longo deste artigo serão apresentadas quais são essas
novas abordagens oferecidas pela API e como elas se relacionam com o que já
existia; isso tudo através de exemplos.
O problema com áreas de memória compartilhadas
Quando
uma área de dados de um programa pode ser acessada por mais de uma thread ao
mesmo tempo, essa área é chamada de região crítica. E quando muitas threads
querem alterar simultaneamente uma região crítica, resultados imprevisíveis
podem acontecer, o que não é algo desejável. Para evitar essa situação é
necessário aplicar uma técnica chamada de exclusão mútua, solução que restringe
o acesso à região crítica a apenas uma thread por vez, o que impede que dados
sejam alterados ao mesmo tempo por diversas linhas de processamento e garante a
consistência dos mesmos.
A linguagem
Java, desde seu início, oferece um meio de viabilizar a exclusão mútua: a
palavra reservada synchronized. Com a sintaxe synchronized(instance){…}, essa instrução bloqueia o
parâmetro recebido através de instance para a thread que realizou a execução. Dessa maneira, o objeto fica
preso à thread, ou seja, ela obtém o bloqueio (lock) do objeto, e enquanto não
liberar esse lock (sair do bloco synchronized), todas as outras que desejarem acessar o objeto terão que esperar,
gerando um efeito exclusivo e bloqueante. Exclusivo porque somente uma thread
pode pegar para si o lock de um objeto e bloqueante porque as outras terão que
esperar a liberação do objeto para ter acesso ao mesmo. Bloqueios que são
exclusivos e bloqueantes são conhecidos como bloqueios pessimistas.
Contudo, o lock de um
objeto obtido através da instrução synchronized é um recurso de baixo
nível que não oferece muita flexibilidade ao desenvolvedor. Desse modo, se uma
thread entra em um bloco synchronized, não há como permitir que outras
também entrem em tal bloco baseado em alguma condição, ou seja, a primeira
thread fará todas as outras esperarem. Ademais, não há como determinar o tempo
máximo de espera para as threads que estão nessa condição, a fim de evitar que
elas fiquem esperando indefinidamente.
Devido a essa “rigidez” da
instrução synchronized que a API de concorrência do Java trouxe
abstrações de alto nível para os bloqueios. Inicialmente representadas pela
interface Lock e as implementações ReadWriteLock, ReentrantLock e ReentrantReadWriteLock, essas novas opções possuem um objetivo
semelhante ao da instrução synchronized, mas com a adição de métodos
como o tryLock(), que possui como um de seus parâmetros o tempo máximo
que uma thread deve esperar para obter o bloqueio, evitando a espera por tempo
indeterminado.
Como base para
demonstração desses recursos, utilizaremos uma classe que representa uma conta
corrente e que possui as operações de crédito, débito e leitura do saldo. Dada
uma instância de conta, caso essa sofra, por exemplo, invocação das operações
de crédito e débito por duas ou mais threads simultaneamente, há grandes
chances de o valor do saldo ficar inconsistente. Para evitar que isso ocorra, é
necessário garantir que não mais de uma thread por vez consiga executar qualquer
uma das operações que alterem o va ...
Oferta válida para todos os planos durante o mês de dezembro
+3 MESES
Grátis
Veja os resultado dos nossos alunos
Conquistas reais de quem está aplicando o método
<Perguntas frequentes>
Carreira
Por onde devo iniciar os estudos?
Recomendamos começar pelo Plano de Estudo Carreira Programador Front-End. Essa área da programação é mais visual e intuitiva, tornando-a ideal para iniciantes. No Front-End, você aprenderá a criar a parte visual dos sites, como layout, cores e interatividade. Depois de dominar o Front-End, você pode avançar para Programador Back-End, onde aprenderá a lidar com a lógica e o funcionamento interno dos sites, e, finalmente, para Programador Mobile, focando no desenvolvimento de aplicativos para smartphones. Nossa metodologia é estruturada de forma progressiva para garantir que você desenvolva confiança e experiência ao criar projetos reais, como sites estáticos e dinâmicos.
Em quanto tempo vou me tornar um programador?
O tempo necessário para se tornar um programador varia de acordo com a dedicação de cada estudante. Com nossa metodologia, que inclui um Plano de Estudo detalhado e suporte contínuo, você pode se tornar um programador de 6 meses a um ano, dependendo do seu ritmo e esforço. Nossa abordagem prática e orientada a projetos ajudará a acelerar seu aprendizado.
Eu preciso de um diploma de faculdade para começar a atuar como programador?
Não. Ser programador é uma excelente oportunidade para quem não possui diploma de faculdade. Muitas empresas contratam baseadas nas habilidades técnicas e experiência prática, não necessariamente em diplomas. Após conquistar uma vaga, você pode optar por complementar sua formação com um diploma.
Por que a programação se tornou a profissão mais promissora da atualidade?
A necessidade de programadores cresceu exponencialmente, especialmente após a pandemia de Covid-19, que forçou muitas empresas a se adaptarem ao digital. Com o crescimento das empresas de tecnologia, a demanda por programadores aumentou. Atualmente, há mais de 200 mil vagas abertas no Brasil devido à falta de profissionais qualificados.
Metodologia
Quais são os principais diferenciais da DevMedia?
Didática e Metodologia
Com mais de 20 anos de experiência, nossa metodologia foca em menos aulas e mais prática. Desenvolvemos dezenas de projetos e exercícios para ajudar você a se tornar um programador completo. Nossos projetos são desafiadores e autênticos, não apenas exercícios repetitivos.
Projetos reais e exercícios
Você desenvolverá diversos projetos práticos em cada carreira (Front-End, Back-End e Mobile), recebendo mentoria e suporte contínuo. A prática é essencial, e oferecemos milhares de exercícios para ajudar você a fixar o conteúdo e melhorar sua posição no ranking.
Suporte ao aluno
Nossa plataforma oferece suporte dedicado com professores experientes, respondendo suas dúvidas em menos de uma hora. Isso garante que você receba a ajuda necessária durante toda a sua jornada de aprendizado.
Gamificação
A DevMedia utiliza gamificação para tornar o aprendizado mais envolvente e motivador. Você acumula pontos e moedas por acertos, que podem ser trocados por produtos e customizações no seu card pessoal. Além disso, o sistema de ranking mensal incentiva a competição amigável e a melhoria contínua.
O que eu irei aprender estudando pela DevMedia?
Ao estudar conosco, você se tornará um programador Full Stack, dominando Front-End, Back-End e Mobile. Utilizamos a linguagem JavaScript, a mais utilizada no mercado, preparando você para criar sistemas webs e aplicativos celulares. Nossa abordagem prática inclui exercícios para fixar o conhecimento e desenvolvimento de projetos reais que te preparam, para o mercado de trabalho.
Quais as vantagens de aprender programação através da linguagem JavaScript?
Ela é Multiplataforma, ela vai te permitir programar para web e para celulares utilizando praticamente a mesma sintaxe.
Elá é Full Stack. Ela te permite criar aplicações Front-end, Back-end e Mobile. Isso acelera muito sua carreira e aumenta suas possibilidades de pegar trabalhos autônomos e conquistar uma vaga no mercado.
Ela é fácil de aprender. Como ela não exige conhecimento inicial em “Orientação a Objetos” ela se torna mais simples com uma curva de aprendizado suave e vai te permitir começar a programar mais rápido do que outras linguagens
A plataforma oferece certificados?
Sim, oferecemos dois tipos de certificados: o certificado de conclusão, que você adquire ao consumir o conteúdo, e o certificado de autoridade, que você obtém ao acertar exercícios. Ambos possuem carga horária, que pode ser utilizada para fins acadêmicos, como atividades complementares na faculdade, e também para comprovações em processos seletivos ou no seu currículo.
A plataforma tem suporte ao aluno, como funciona?
Sim, temos uma equipe de programadores pronta para ajudar com todas as suas dúvidas! Durante o horário comercial, o tempo médio de resposta é de até 10 minutos. E não se preocupe, também oferecemos suporte à noite e nos finais de semana, com um prazo de resposta um pouco maior.
A DevMedia me forma como programador Full Stack?
Sim! Oferecemos uma formação completa, do zero até Full Stack. Nosso foco é na prática, então você vai encontrar muitos exercícios e projetos reais ao longo do curso. Garantimos que você sairá com a autonomia necessária para desenvolver seus próprios projetos com confiança!
Tem horário para as aulas?
Não, não temos horários fixos para as aulas. Todo o nosso conteúdo está disponível para você acessar a qualquer momento, permitindo que você estude conforme sua própria disponibilidade e ritmo. Dessa forma, você pode integrar o aprendizado à sua rotina de maneira mais flexível e eficaz.
Por que a DevMedia não usa videoaulas em sua didática?
Nosso foco principal é formar programadores de verdade. Sabemos que o dia a dia de um programador envolve muita leitura, interpretação e escrita de código. Por isso, nosso conteúdo é desenvolvido para ambientar você nesse processo desde o início, proporcionando mais autonomia e acelerando seu aprendizado.
Na vídeo-aula é o professor que está lendo, interpretando e escrevndo o código para você, isso limita o seu progresso. Ao ler e interagir diretamente com o conteúdo, você exercita sua capacidade de leitura e concentração, além de poder avançar no seu próprio ritmo. Dessa forma, você se torna um programador mais independente e preparado para os desafios reais do mercado.
Preciso de um computador específico para estudar na DevMedia?
Não é necessário nada específico. Qualquer computador com processador atual e memória de 8 GB é suficiente.
Eu consigo estudar pelo celular?
Sim, a DevMedia possui um aplicativo que te permite seguir com seus estudos de qualquer lugar.
A DevMedia tem aplicativo?
Sim, nosso aplicativo está disponível na Play Store e na Apple Store, permitindo que você estude de forma prática e conveniente em qualquer lugar.
Preciso estar na faculdade para acompanhar os estudos na DevMedia?
Não, a faculdade não é necessária. Você não precisa de nenhum conhecimento prévio para iniciar os estudos na nossa plataforma.
Assinatura e Pagamentos
Quais são os planos de assinatura disponíveis?
Oferecemos o plano anual, o valor total é lançado no cartão de crédito, parcelado em 12 vezes, e você precisa dispor do valor total no limite do seu cartão. Você também pode optar por pagar no PIX
Adquirindo o plano, terei acesso a todo o conteúdo?
Sim, ao assinar nossa plataforma, você desbloqueia acesso total a todo o nosso conteúdo, sem precisar comprar nada separadamente.
A plataforma tem planos vitalícios?
Não, nossos planos são anuais, garantindo que você tenha acesso contínuo às atualizações mais recentes e aos novos conteúdos. A tecnologia evolui rapidamente, e um plano vitalício oferece um conteúdo estático que se tornará ultrapassado em pouco tempo. Com nossos planos anuais, você está sempre à frente, aprendendo as novidades e tendências mais atuais no mundo da programação.
A DevMedia tem fidelidade?
Sim, nosso plano tem uma fidelidade de 12 meses, o que garante o tempo ideal para você explorar nosso conteúdo e desenvolver a autonomia necessária para trabalhar com programação.
Como funciona o cancelamento?
Nós garantimos seu direito de cancelamento com reembolso total dentro dos primeiros 7 dias.
Para que você aproveite ao máximo seu investimento, oferecemos suporte personalizado para orientá-lo na utilização da plataforma. Também temos a opção de transferência de titularidade do plano, permitindo que outra pessoa aproveite o restante do seu período de assinatura.
Cadastro
Como excluir meus dados da plataforma?
Para excluir seus dados da plataforma, acesse o link : https://www.devmedia.com.br/fale-conosco/ e abra um protocolo de 'Exclusão de dados'. Nossa equipe processará a solicitação e removerá todas as informações do seu cadastro.
Compartilhe esse conteúdo com um amigo!
Faça login para ganhar recompensas.
Ou
Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.