并发编程-concurrent指南-信号量Semaphore

Semaphore翻译成字面意思为 信号量,Semaphore可以控同时访问的线程个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。

acquire()用来获取一个许可,若无许可能够获得,则会一直等待,直到获得许可。

release()用来释放许可。注意,在释放许可之前,必须先获获得许可。

下面通过一个例子来看一下Semaphore的具体使用:

假若一个工厂有5台机器,但是有8个工人,一台机器同时只能被一个工人使用,只有使用完了,其他工人才能继续使用。那么我们就可以通过Semaphore来实现:

import java.util.concurrent.Semaphore;

public class Main {
    public static void main(String[] args) {
        Semaphore semaphore = new Semaphore(5);//5台机器

        //8个工人工作
        for(int i=0;i<8;i++){
            new Thread(new Worker(semaphore)).start();
        }
    }
}
import java.util.Random;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

/**
 * 工人
 */
public class Worker implements Runnable{
    private Semaphore semaphore;
    public Worker(Semaphore semaphore){
        this.semaphore = semaphore;
    }

    @Override
    public void run() {
        try {
            semaphore.acquire();
            System.out.println(Thread.currentThread().getName()+"占用一个机器生产。。。");
            int random = new Random().nextInt(10);
            TimeUnit.SECONDS.sleep(random);
            System.out.println(Thread.currentThread().getName()+"释放出机器");
            semaphore.release();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

适用场景:

Semaphore其实和锁有点类似,它一般用于控制对某组资源的访问权限。

源码地址:https://github.com/qjm201000/concurrent_semaphore.git

扫描二维码关注公众号,回复: 4580189 查看本文章

猜你喜欢

转载自www.cnblogs.com/qjm201000/p/10150270.html