并发 信号量 Semaphore

what:

Semaphore是用来控制同时访问特定资源的线程数量,他经过协调各个线程,以保证合理的使用公共资源。数据库

why:

每一个资源所能承受的并发负载是有限的。并发

how:

Semaphore能够用于作流量控制,特别是公用资源有限的应用场景,好比数据库链接。假若有一个需求,要读取几万个文件的数据,由于都是IO密集型任务,咱们能够启动几十个线程并发的读取,可是若是读到内存后,还须要存储到数据库中,而数据库的链接数只有10个,这时咱们必须控制只有10个线程同时获取数据库链接保存数据,不然会报错没法获取数据库链接。这个时候,就可使用Semaphore来作流量控制,以下所示。ide

public class SemaphoreTest {
    private static final int THREAD_COUNT=30;
    private static ExecutorService threadPool =Executors.newFixedThreadPool(THREAD_COUNT);
    private static Semaphore s = new Semaphore(10);
    public static void main(String[] args) {
        for (int i = 0; i < THREAD_COUNT; i++) {
            threadPool.execute(new Runnable() {
                @Override
                public void run() {
                    try {
                        s.acquire();
                        System.out.println("save data");
                        s.release();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
        }
        threadPool.shutdown();
    }
}

注:以上代码中,虽然有30个线程在执行,可是只容许10个并发执行。Semaphore的构造方法Semaphore(int permits)接受一个整型的数字,表示可用的许可证数量。Semaphore(10)表示容许10个线程获取许可证,也就是最大并发是10。Semaphore的用法也很简单,首先线程使用Semaphore的acquire()方法获取一个许可证,若是获取失败,则进入阻塞,使用完以后调用release()方法归还许可证。还能够用tryAcquire()方法尝试获取许可证。ui

相关文章
相关标签/搜索