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等內容。