面试:Semaphore(信号量)的成长之路
2019最寒冷,面试跳槽不能等
马上就3月份了,所谓的金三银四招聘季。2019年也许是互联网最冷清的一年,很多知名的大型互联网公司都裁员过冬。当然也有一些公司还在持续招人的,比如阿里就宣称不裁员,反而要增加更多的就业机会。
面试大公司的职位,基础显得很重要,在并发编程这块问的自然也比较多。对于一个Java程序员而言,能否熟练掌握并发编程是判断他优秀与否的重要标准之一。因为并发编程是Java语言中最为晦涩的知识点,它涉及操作系统、内存、CPU、编程语言等多方面的基础能力,更为考验一个程序员的内功。
今天我们就来聊聊Java中的Semaphore(信号量)在面试过程中会有哪些问题,以及如何回答。
问题一:什么是信号量?
信号量就相当于一个计数器,通常用来限制线程的数量。每个线程操作前会先获取一个许可证,逻辑处理完成之后就归还这个许可证。
就好比我们去网吧上网,信号量初始化的大小就好比网吧中所有的电脑。当有人交费开机之后,可用电脑的数量就少了1台。依次类推,当有人下机之后可用的电脑数量又多了。当机器被用完之后新来的客人就只能等待前面的人下机,这就是归还许可证。
问题二:信号量的应用场景?
信号量的核心功能就是用来对资源做一定的限制,防止出现崩塌现象。最适用的应用场景那就是限流,通过限流来保护对应的资源。
在Spring Cloud中我们会用Hystrix来保护服务,进行熔断降级。在Hystrix中有两种模式,分别是线程池和信号量,说到这里大家明白了吧,信号量的作用。
在限流层面,最简单的实现可以用信号量来实现本地限流操作,集群限流必须得依赖第三方中间件,比如Redis。
问题三:你有在项目中使用过信号量吗?
这个问题那就得根据你的实际情况来说明了,如果确实没用用过,你可以稍微构思一下,在哪些业务场景下可以使用,然后封装下,对吧,搞Java的怎么能不会封装呢,然后侃侃而谈,我用过啊,我在那个啥....用过啊....为了满足xxx的需求啊。。。
比如:在我们的爬虫系统中,都会通过多线程的方式去爬取数据,而有些小型网站,并发能力不是特别强,线程数一上去就很慢,然后服务出现504,502最后爬取不了,这个时候就需要对并发抓取量做一些限制了,这个时候就可以用信号量来进行限制。
还有些并发量强的网站,能抗住很多的请求,但是人家的反爬取策略做的好啊,请求数量稍微多一点就能识别你是机器,给你封了,这也是需要做一些限制。
剩下的就靠你自己吹牛啦。。。
public class SemaphoreDemo {
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(10);
Semaphore semaphore = new Semaphore(2);
for (;;) {
executorService.execute(() -> {
try {
semaphore.acquire();
System.out.println("抓取数据逻辑");
} catch (Exception e) {
e.printStackTrace();
} finally {
semaphore.release();
}
});
}
}
}
总结推荐
我这边只是列举了简单的三个问题,实际面试中可能问的更深入,在并发这块我也不是什么高手,我也是一直在学习的过程中,其实在2年之前吧,我自己也录制过一套并发的课程,在我的网站猿天地上面。感兴趣的同学可以去了解下,讲了线程,线程池,锁,CountDownLatch,Semaphore等内容。
欢迎加入我的知识星球,一起交流技术,免费学习猿天地的课程(http://cxytiandi.com/course)
PS:目前星球中正在星主的带领下组队学习Sentinel,等你哦!
面试:Semaphore(信号量)的成长之路的更多相关文章
- java架构之路(多线程)JUC并发编程之Semaphore信号量、CountDownLatch、CyclicBarrier栅栏、Executors线程池
上期回顾: 上次博客我们主要说了我们juc并发包下面的ReetrantLock的一些简单使用和底层的原理,是如何实现公平锁.非公平锁的.内部的双向链表到底是什么意思,prev和next到底是什么,为什 ...
- java 成长之路[轉載u]
分享总结title: java 成长之路tags:grammar_cjkRuby: true 经验差异 1-3年 要求 建议 3-5年 建议 5年+ 经验差异 最近一年比较忙,经历了创业公司的倒闭.这 ...
- java 成长之路
分享总结 title: java 成长之路 tags: grammar_cjkRuby: true 经验差异 1-3年 要求 建议 3-5年 建议 5年+ 经验差异 最近一年比较忙,经历了创业公司的倒 ...
- --专访雷果国: 从1.5K到18K 一个程序员的5年成长之路--
导语:今年三月份,在CSDN博客和新浪微博上有一篇<从1.5K到18K,一个程序员的5年成长之路>被众人分享和传阅,这篇博文首先介绍了作者自学之初薄弱的基础,然后通过流水账形式分享了那个从 ...
- 专访雷水果国:离1.5K至18K 一个程序猿5每年的成长之路
我只是一个小菜鸟,对于自主学习和交流PHP(jquery,linux,lamp,shell,javascript,server)等一系列的知识.小菜鸟创建了一个群.希望光临本博客的人能够进来交流. 寻 ...
- Java程序员的成长之路
阅读本文大概需要 8.2 分钟. tips:虽然题目是写的Java程序员,但对其他语言的开发来说也会有借鉴作用. 本篇介绍的是大体思路,以及每个节点所需要学习的书籍内容,如果大家对详细的技术点有需要, ...
- 《菜鸟程序员成长之路:从技术小白到阿里巴巴Java工程师》
<菜鸟程序员成长之路:从技术小白到阿里巴巴Java工程师> 国庆节快乐!一年一度长度排第二的假期终于来了. 难得有十一长假,作者也想要休息几天啦. 不管你是选择出门玩,还是在公司加班,在学 ...
- 原创电子书《菜鸟程序员成长之路:从技术小白到阿里巴巴Java工程师》
<菜鸟程序员成长之路:从技术小白到阿里巴巴Java工程师> 国庆节快乐!一年一度长度排第二的假期终于来了. 难得有十一长假,作者也想要休息几天啦. 不管你是选择出门玩,还是在公司加班,在学 ...
- redis成长之路——(二)
redis操作封装 针对这些常用结构,StackExchange.Redis已经做了一些封装,不过在实际应用场景中还必须添加一些功能,例如重试等 所以对一些常功能做了一些自行封装SERedisOper ...
- redis成长之路——(一)
为什么使用redis Redis适合所有数据in-momory的场景,虽然Redis也提供持久化功能,但实际更多的是一个disk-backed的功能,跟传统意义上的持久化有比较大的差别,那么可能大家就 ...
随机推荐
- linux基础学习路线&review
linux基础学习网址: https://www.runoob.com/linux/linux-tutorial.html 比较重点的是这个启动过程的介绍学习:https://www.runoob.c ...
- 【前端知识体系-JS相关】对移动端和Hybrid开发的理解?
1.hybrid是什么,为何使用hybrid呢? 概念: hybrid就是前端和客户端的混合开发 需要前端开发人员和客户端开发人员配合完成 某些环节也可能会涉及到server端 大前端:网页.APP. ...
- 一.OS运行机制
运行机制: 1.中断(外部) =====一种通知行为(例如插入键盘) 2.系统调用(主动反应) ===一种请求行为 3.异常(内部) =====一种错误处理行为 系统调用和程序接口的关系,接口把系统调 ...
- switch的对象不能为null
我写的NPE 虽然不多, 但几乎每次系统出问题的时候,看到api返回值是空的,绝大多数是NPE造成的. 这时候会感慨一下谁写的bug,然后去补判空代码. 最近抽风,开始给自己写的代码添加UnitTes ...
- 使用 jQuery.TypeAhead 让文本框自动完成 (二)(访问远程数据)
项目地址:https://github.com/twitter/typeahead.js 直接贴代码了: @section headSection { <script type="te ...
- JS运算符类型
一.运算符类型 1.算术运算符: 用于各类数值运算,包括加(+).减(-).乘(*).除(/).求余(或称模运算,%).自增(++).自减(--)共七种. 2.关系运算符: 用于比较运算.包括大于(& ...
- Java中级—转发和重定向的区别
在设计Web应用程序的时候,经常需要把一个系统进行结构化设计,即按照模块进行划分,让不同的Servlet来实现不同的功能,例如可以让其中一个Servlet接收用户的请求,另外一个Servlet来处理用 ...
- js实现复制功能兼容ios
html: <div id="copyBT">这是要复制的1内容</div> <a id="contentas">这是复制按 ...
- Java有参构造方法和成员方法
Java面向对象基础就包括有参构造方法和成员方法 无参构造声明方式为 class Teacher{ //无参构造方法,一般用在初始化变量 public Teacher(){ } } 有参构造声明为 c ...
- Alpha2项目的测试
这个作业属于哪个课程 课程的链接 这个作业的要求在哪里 作业要求的链接 团队名称 西柚三剑客 这个作业的目标 -测试其他团队的作品,并进行体验总结 姓名 学号 团队名称 段小刚 20173106231 ...