Diretório de artigos
prefácio
Semaphore
Atualmente 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
Semaphore
Uso 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
Semaphore
Na verdade, é um pouco semelhante a um bloqueio, geralmente usado para controlar o acesso a um determinado conjunto de recursos.