Semáforo Explicação Detalhada da Programação Simultânea Java

prefácio

SemaphoreAtualmente amplamente utilizado em ambientes multi-threaded, o semáforo é um conceito muito importante, que possui aplicações no controle de processos. O Semáforo da biblioteca de concorrência Java pode facilmente completar o controle de semáforo.O Semáforo pode controlar o número de um recurso que pode ser acessado ao mesmo tempo, acquire() obtendo uma licença, esperando se não, e release()liberando uma licença. Por exemplo, no Windows, você pode definir o número máximo de clientes para acessar arquivos compartilhados.

método de construção

A classe Semaphore está localizada no pacote java.util.concurrent, que fornece dois construtores:

//参数permits表示许可数目,即同时可以允许多少线程进行访问
public Semaphore(int permits) {
    
              
    sync = new NonfairSync(permits);
}

//这个多了一个参数fair表示是否是公平的,即等待时间越久的越先获取许可
public Semaphore(int permits, boolean fair) {
    
        
    sync = (fair)? new FairSync(permits) : new NonfairSync(permits);
}

método comum

Vários métodos importantes, o primeiro é o métodoadquire(), release():

public void acquire() throws InterruptedException {
    
      }     //获取一个许可
public void acquire(int permits) throws InterruptedException {
    
     }    //获取permits个许可
public void release() {
    
     }          //释放一个许可
public void release(int permits) {
    
     }    //释放permits个许可

adquire() é usado para adquirir uma licença, se nenhuma licença puder ser obtida, ele aguardará até que a licença seja obtida.

release() é usado para liberar a licença. Observe que, antes de liberar a licença, certifique-se de obtê-la primeiro. Caso contrário, o número total de licenças estará errado

Se você deseja obter o resultado da execução imediatamente, pode usar os seguintes métodos:

public boolean tryAcquire() {
    
     };    //尝试获取一个许可,若获取成功,则立即返回true,若获取失败,则立即返回false
public boolean tryAcquire(long timeout, TimeUnit unit) throws InterruptedException {
    
     };  //尝试获取一个许可,若在指定的时间内获取成功,则立即返回true,否则则立即返回false
public boolean tryAcquire(int permits) {
    
     }; //尝试获取permits个许可,若获取成功,则立即返回true,若获取失败,则立即返回false
public boolean tryAcquire(int permits, long timeout, TimeUnit unit) throws InterruptedException {
    
     }; //尝试获取permits个许可,若在指定的时间内获取成功,则立即返回true,否则则立即返回false
public int availablePermits();  // 返回此信号量中可用的许可证的当前数量。

prática de código

SemaphoreUso específico através de exemplos :

Existem cinco vagas no estacionamento, e dez carros precisam entrar no estacionamento para estacionar. Neste momento, é necessário garantir que apenas cinco carros possam entrar quando o estacionamento for o maior e apenas um carro pode entra quando um sai.

Código:

 public static void main(String[] args) {
    
    
        // 停车场车位数量
        Semaphore semaphore = new Semaphore(5);

        for (int i = 1; i <= 10; i++) {
    
    
            Thread thread = new Thread(() -> {
    
    
                try {
    
    
                    semaphore.acquire();
                    System.out.println(Thread.currentThread().getName() + "进入停车场");
                    TimeUnit.SECONDS.sleep(new Random().nextInt(10));
                    System.out.println(Thread.currentThread().getName() + "驶离停车场");
                } catch (InterruptedException e) {
    
    
                    throw new RuntimeException(e);
                }finally {
    
    
                    semaphore.release();
                }
            }, i + "号车");
            thread.start();
        }
    }

resultado da operação:

1号车进入停车场
4号车进入停车场
3号车进入停车场
2号车进入停车场
5号车进入停车场
1号车驶离停车场
7号车进入停车场
4号车驶离停车场
6号车进入停车场
5号车驶离停车场
8号车进入停车场
3号车驶离停车场
9号车进入停车场
9号车驶离停车场
10号车进入停车场
2号车驶离停车场
6号车驶离停车场
7号车驶离停车场
8号车驶离停车场
10号车驶离停车场

Process finished with exit code 0

SemaphoreNa verdade, é um pouco semelhante a um bloqueio, geralmente usado para controlar o acesso a um determinado conjunto de recursos.

Acho que você gosta

Origin blog.csdn.net/weixin_43847283/article/details/128517491
Recomendado
Clasificación