O que é semáforo em Java e como usá-lo?

Publicados: 2022-05-26

A Sun Microsystems em 1995 trouxe o Java para nós, que era uma linguagem de programação colaborativa, dependente de classes e objetos e uma plataforma de computador. Um grande número de programas e sites não funcionará a menos que você tenha o Java instalado, e mais estão sendo desenvolvidos diariamente. Java é comercializado e elogiado por sua velocidade rápida, segurança e confiabilidade. É uma linguagem de computador criada especificamente para uso no mundo disperso da Internet. Ele foi feito tendo em mente o design da linguagem de programação C++, mas é mais fácil de usar e impõe uma abordagem de programação orientada a objetos.

Um programa PG executivo em desenvolvimento de software ensina exatamente todas as habilidades necessárias para se destacar em Java.

Exemplo de semáforo:

Mutex var compartilhado: semáforo = 1;

Processo i

começar

.

.

P(mutex);

executar CS;

V(mutex);

.

.

Fim;

Índice

O que faz o Java se destacar?

Uma comunidade dedicada de desenvolvedores, arquitetos e entusiastas Java testou, aperfeiçoou, expandiu e validou o Java. Apesar de suas raízes de quase duas décadas, Java evoluiu de forma constante ao longo dos anos.

Java destina-se a facilitar o desenvolvimento de programas portáteis e de alto desempenho para uma ampla gama de sistemas de computador, suportando as noções essenciais de acessibilidade e interação entre plataformas. As empresas podem fornecer serviços adicionais, aumentar a produtividade, a comunicação e a colaboração do usuário final e reduzir drasticamente o custo de aplicativos corporativos e de consumo, disponibilizando-os em configurações heterogêneas.

O que é semáforo em Java?

Um semáforo usa um contador para regular o acesso a um recurso compartilhado. O acesso é permitido se o contador for maior que zero. Se o valor for 0, o acesso é recusado. O contador conta as permissões que fornecem acesso ao recurso compartilhado. Como resultado, para acessar o recurso, um thread deve primeiro obter permissão do semáforo.

Como funciona?

Geralmente, ao usar um semáforo, o thread que tenta acessar o recurso compartilhado tenta obter permissão. Se a contagem de semáforos for maior que zero, o encadeamento obtém permissão, fazendo com que a contagem de semáforos diminua. Caso contrário, o thread será interrompido até que uma licença seja obtida.

Quando o encadeamento não requer mais acesso ao recurso compartilhado, ele libera a permissão, fazendo com que a contagem de semáforos aumente. Se outro thread estiver aguardando permissão, esse thread receberá uma naquele momento.

Tipos de semáforo

Existem quatro tipos de semáforo em java. Eles são os seguintes:

Semáforo binário :

Um semáforo binário aceita apenas 0 e 1 como valores e é usado para criar exclusão mútua e sincronizar atividades simultâneas.

Exemplo de semáforo binário:

classe pública BinarySemaphoreExample

{

booleano privado bloqueado = false;

BinarySemaphore(int inicial)

{

bloqueado = (inicial == 0);

}

público sincronizado void waitForNotify() lança InterruptedException

{

enquanto (bloqueado)

{

esperar();

}

bloqueado = verdadeiro;

}

public sincronizado void notifyToWakeup()

{

se (bloqueado)

{

notificar();

}

bloqueado = falso;

}

}

Leia nossos artigos populares relacionados ao desenvolvimento de software

Como implementar a abstração de dados em Java? O que é classe interna em Java? Identificadores Java: Definição, Sintaxe e Exemplos
Entendendo o encapsulamento em OOPS com exemplos Argumentos de linha de comando em C explicados Os 10 principais recursos e características da computação em nuvem em 2022
Polimorfismo em Java: Conceitos, Tipos, Características e Exemplos Pacotes em Java e como usá-los? Tutorial do Git para iniciantes: aprenda o Git do zero

Semáforo de contagem :

A cada momento, o valor de um semáforo de contagem representa o número máximo de processos que podem acessar a área crítica ao mesmo tempo.

Exemplo de semáforo de contagem:

classe pública ContagemSemaphoreExample

{

sinal int privado = 0;

take void sincronizado público()

{

este.sinal++;

this.notificar();

}

liberação void sincronizada pública () lança InterruptedException

{

while(este.sinal == 0)

esperar();

este.sinal–;

}

}

Semáforo cronometrado:

Os semáforos cronometrados permitem que um thread seja executado por um determinado período de tempo. Após um determinado período, o cronômetro é reiniciado e todas as outras autorizações são liberadas.

Exemplo de um semáforo temporizado:

class TimedSemáforosExemplo

{

semáforo privado TimedSemaphore;

TimedSemaphoreExample(long period, int slotLimit)

{

semáforo = new TimedSemaphore(período, TimeUnit.SECONDS, slotLimit);

}

booleano tryAdd()

{

return semáforo.tryAcquire();

}

int disponívelSlots()

{

return semáforo.getAvailablePermits();

}

}

Semáforo limitado :

Podemos definir o limite superior usando semáforos limitados. Ele é usado em vez de contar semáforos, pois eles não têm valor limite superior. O valor do limite superior representa o número máximo de sinais que podem ser armazenados.

Exemplo de semáforo limitado :

classe pública BoundedSemaphoresExample

{

sinais int privados = 0;

limite int privado = 0;

public BoundedSemaphoreexample(int upperBound)

{

this.bound = upperBound;

}

public void sincronizado take() lança InterruptedException

{

while(this.signals == vinculado)

esperar();

this.signals++;

this.notify++;

}

Public void versão sincronizada () lança InterruptedException

{

while(este.sinal == 0)

esperar();

this.signals–;

}

}

Explore nossos cursos populares de engenharia de software

SL. Não Programas de Desenvolvimento de Software
1 Mestre em Ciência da Computação pela LJMU & IIITB Programa de Certificado de Segurança Cibernética Caltech CTME
2 Curso de Desenvolvimento Full Stack Programa PG em Blockchain
3 Programa de Pós-Graduação Executiva em Desenvolvimento de Software - Especialização em DevOps Veja todos os Cursos de Engenharia de Software

Características:

Um semáforo tem as seguintes características:

  • Ele permite que as threads se comuniquem umas com as outras.
  • Reduz o grau de sincronia. Como resultado, ele fornece um método de sincronização de baixo nível.
  • Não há valor negativo no semáforo. Tem um valor que pode ser maior ou igual a zero.
  • Podemos implementar o semáforo usando a operação de teste e interrupções e executá-lo usando descritores de arquivo.

Prós e contras dos semáforos:

Vantagens:

  1. Permite que muitos fios alcancem a parte vital.
  2. Os semáforos são independentes da máquina.
  3. Os semáforos são implementados no código independente de máquina do microkernel.
  4. Vários processos não têm permissão para acessar a seção crucial.
  5. Não há desperdício de tempo ou recursos do processo, pois sempre há uma espera ocupada no semáforo.
  6. Eles são independentes de máquina e, portanto, devem ser executados no código independente de máquina do microkernel.
  7. Eles permitem o gerenciamento de recursos que é adaptável.

Desvantagens:

  1. A inversão de prioridade é uma das restrições mais significativas de um semáforo.
  2. O sistema operacional deve acompanhar todas as chamadas de semáforo de espera e sinal.
  3. Seu uso nunca é obrigatório, mas simplesmente por tradição.
  4. As ações Wait e Signal devem ser feitas corretamente para evitar deadlocks no semáforo.
  5. Como a programação de semáforos é complicada, há uma probabilidade de que a exclusão mútua não seja alcançada.
  6. Também não é uma estratégia realista para aplicativos de grande escala, pois resulta em perda de modularidade.
  7. Semáforo é mais suscetível a erros de programação.
  8. Um erro de programação pode resultar em um impasse ou uma violação de exclusão mútua.

Como usar o Semáforo como Bloqueio?

Um semáforo pode ser usado como um bloqueio em Java. Significa que restringe o acesso ao recurso. Para adquirir o bloqueio, qualquer thread que queira acessar o recurso bloqueado deve primeiro chamar a função Acquir(). Após concluir o trabalho, a thread deve liberar o bloqueio invocando a função release(). Tenha em mente que o limite superior deve ser definido como 1. Um curso PG executivo em desenvolvimento full-stack o ajudará a dominar todas essas habilidades.

Resumo

Ter uma ideia clara sobre linguagens de programação como Java é essencial para uma carreira brilhante como desenvolvedor de software. O upGrad oferece vários cursos que podem lhe dar o chute certo para uma carreira promissora. Uma especialização em desenvolvimento full-stack da Purude University at upGrad ensinará a você todas as habilidades necessárias para florescer no campo do desenvolvimento de software.

Aprenda cursos de desenvolvimento de software online das melhores universidades do mundo. Ganhe Programas PG Executivos, Programas de Certificado Avançado ou Programas de Mestrado para acelerar sua carreira.

Por que precisamos do Semáforo em Java?

Um semáforo é uma variável usada para sincronização de processos para gerenciar processos simultâneos. Ele também evita um problema de corrida controlando o acesso a um recurso compartilhado por vários processos simultâneos.

Por que precisamos do semáforo de contagem?

Os semáforos são frequentemente usados ​​para coordenar o acesso a recursos, com a contagem de semáforos definida para a lista de recursos totais. Quando os recursos são fornecidos ou adicionados, os encadeamentos aumentam atomicamente a contagem e, quando os recursos são retirados, os encadeamentos reduzem a contagem atomicamente.

Por que o Semaphore é conhecido como uma ferramenta de sincronização?

Semáforo é essencialmente uma variável inteira compartilhada por muitos threads. Esta variável é utilizada no ambiente de multiprocessamento para superar o problema da seção crítica e estabelecer a sincronização do processo. Isso às vezes é chamado de bloqueio mutex.

O que é desenvolvimento full-stack?

O desenvolvimento full-stack é a criação dos componentes front-end (lado do cliente) e back-end (lado do servidor) de um aplicativo da Web. Desenvolvedores web full-stack podem criar aplicativos e sites online completos. Eles são responsáveis ​​pelo frontend, backend, banco de dados e depuração de aplicativos ou sites online.