Semaphore实战

Java38

Semaphore信号量计数器。和CountDownLatch,CyclicBarrier类似,是多线程协作的工具类,相对于join,wait,notify方法使用起来简单高效。下面我们主要看看它的用法吧!

  • 限流。限制线程的并发数。

比如在一个系统中同时只能保证5个用户同时在线。

如上代码所示:我们定义了20个用户同时访问系统,Semaphore参数是5,表示同时只能有5个用户可以获取凭证,其他用户必须等待直到有在线用户退出。调用semaphore.acquire()表示获取凭证,此时凭证数会减一,调用semaphore.release()表示释放凭证,凭证数会加一,如果系统中有等待的用户,操作此方法会通知等待的一个用户获取凭证成功,执行登录操作。最后打印 部分结果如下:证明系统最多能保持5个用户同时在线。

注意:上面举出的这个案例,出个思考题:线程池是否可以实现呢?

  • 模拟CyclicBarrier,CountDownLatch重用!

Semaphore可以轻松实现 CountDownLatch计数器, CyclicBarrier回环屏障,还记得 CountDownLatch用法么?它是个计数器,可以帮我们统计线程执行时间,常用来测试多线程高并发执行接口效率,我们下面用 Semaphore模拟多线程主线程等待子线程执行完毕再返回。

如上代码所示:我们定义了Semaphore初始化信号量为0,默认是非公平锁,在主线程中用线程池提交2个线程,主线程调用semaphore.acquire(2)表示需要获取两个信号量,但此时初始化信号量为0,此时AQS中的state会是0-2=-2,state值小于0,所以主线程执行这句话会阻塞将其加入AQS同步队列,线程池两个线程等待2秒后会调用semaphore.release()释放2个信号量,此时AQS中的state会自增到0,会通知主线程退出等待继续往下执行。执行结果如下图所示。

有没有发现 Semaphore用法可以模拟 CountDownLatch,另外 Semaphore通过调用acquire,release方法,还可以实现CyclicBarrier功能!我们不举例了。

实现原理

输入验证码查看隐藏内容

扫描二维码关注本站微信公众号 Johngo学长
或者在微信里搜索 Johngo学长
回复 svip 获取验证码
wechat Johngo学长

相关文章
Java

Vue3的main.js的坑

Vue2升级为Vue3之后有很多新内容,但也有很多坑,这里讲下我今天刚学Vue3遇到的坑。可以直接到最后看main.js。 首先就是Element-ui,前端vue一般都使用这个插件,但这个插件在Vu...
Java

方法(Java)

什么是方法? 基本介绍 在其他语言中也叫函数 System.out.println();类名.对象.方法; Java方法是语句的集合,它们在一起执行一个功能 方法是解决一类问题的步骤的有序集合 方法包...
Java

MySQL中的WHERE和HAVING

使用 GROUP BY语句时,有时会同时使用 WHERE和 HAVING,常常会因为搞不清楚要用哪个而写错,这里记录一下 TL;NRs WEHRE语句必须在 GROUP BY之前,用于对表中数据进行筛...
Java

SpringMVC(1)

一:SpringMVC简介:它时一种设计模式或者称为设计规范,M既Model层,模型层,主要对应Javaweb时的Dao和service,V即View层,视图层,主要对应Javaweb时的jsp/HT...
Java

我入职腾讯啦

蚂蚁金服上市的消息我想已经席卷了大家的朋友圈了,我也第一时间慰问了我所有蚂蚁的朋友,有期权的小伙伴都在估算自己变现后数字了,确实有很多老阿里人有财富自由的机会了,也有P7以下没期权苦恼的小伙伴。 事实...
Java

Java(14)对象构造

之前学习了编写简单的构造器,可以定义对象的初始状态。但是,由于对象构造非常重要,所以Java提供了多种编写构造器的机制。 有些类有多个构造器。例如,可以如下构造一个空的 StringBuilder对象...
Java

Java并发编程艺术系列-四、 Java并发编程基础

四、 Java并发编程基础 本章将着重介绍Java并发编程的基础知识,从启动一个线程到线程间不同 的通信方式,最后通过简单的线程池示例以及应用(简单的Web服务器)来串联本章所介绍的内容。 4.1 线...
Java

git 常用操作

可以把分支名理解为指针,比如 master,test,origin/master 等,都是一个指针,指向某次提交快照 特殊指针HEAD:Git有一个名为 HEAD 的特殊指针,它是一个指针,指向当前所...