博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
并发 信号量 Semaphore
阅读量:6158 次
发布时间:2019-06-21

本文共 1346 字,大约阅读时间需要 4 分钟。

hot3.png

what:

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

why:

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

how:

Semaphore可以用于做流量控制,特别是公用资源有限的应用场景,比如数据库连接。假如有一个需求,要读取几万个文件的数据,因为都是IO密集型任务,我们可以启动几十个线程并发的读取,但是如果读到内存后,还需要存储到数据库中,而数据库的连接数只有10个,这时我们必须控制只有10个线程同时获取数据库连接保存数据,否则会报错无法获取数据库连接。这个时候,就可以使用Semaphore来做流量控制,如下所示。

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()方法尝试获取许可证。

转载于:https://my.oschina.net/u/2351011/blog/3057271

你可能感兴趣的文章
☆1018
查看>>
oracle 去掉空格
查看>>
6.13心得
查看>>
Runtime类
查看>>
eclipse decompiler
查看>>
记一个搜索网盘资源的网站
查看>>
jdk1.7和jdk1.8的String的getByte方法的差异
查看>>
java父子进程通信
查看>>
Android ADB server didn't ACK * failed to start daemon * 简单有效的解决方案
查看>>
Olap学习笔记
查看>>
Codeforces Round #431 (Div. 1)
查看>>
如何进行数组去重
查看>>
将标题空格替换为 '_' , 并自动复制到剪切板上
查看>>
List Collections sort
查看>>
Mysql -- You can't specify target table 'address' for update in FROM clause
查看>>
使用局部标准差实现图像的局部对比度增强算法。
查看>>
2017-2018-1 20165313 《信息安全系统设计基础》第八周学习总结
查看>>
《代码敲不队》第四次作业:项目需求调研与分析
查看>>
菜鸡互啄队—— 团队合作
查看>>
HttpWebRequest的GetResponse或GetRequestStream偶尔超时 + 总结各种超时死掉的可能和相应的解决办法...
查看>>