面試: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,等你哦!

微信掃碼加入猿天地知識星球

猿天地


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM