java面經查缺補漏之第五十天(基本類型和引用類型,秒殺大概思路,nginx限流,限流算法,unsafe類,多線程的通信方式,juc阻塞隊列,死鎖的解決方式)

前幾天申請的博客專家失敗了,原因是半年基本上說我都是在記錄日常。難道我起的名字日常,內容就很日常了嗎?我的名字就是一天一道編程題,查缺補漏第多少天。這半年都在專注於算法數據結構的學習,以及javaweb理論的研究,可能是覺得博客的深度不夠吧,從今天起,本博客將不注重產量,而轉而注重博客的深度,以及長文了,偶爾發一下這種查缺補漏的內容吧。加油!

1.java基本類型和引用類型的區別?

參考:https://www.cnblogs.com/maskwolf/p/9972982.html

8大基本數據類型,byte,boolean,char,int,short,long,float,double

引用類型,類,字符串等,除了基本,大概都是引用類型。

區別一 存儲位置

基本數據類型作爲非全局變量存儲在棧當中。

引用類型具體內容很多都存儲在堆中,然後棧中存儲一個指針,指向這個內存地址。

2. 秒殺系統實現大概都要什麼技術?

(1)從架構上說

分佈式+集羣,對服務器進行物理上的擴容

(2)從負載均衡上說

利用nginx實現負載均衡,並對某一個ip進行ip級別的限流

(3)將頁面靜態化

因爲頁面上的一些數據也會請求後端服務器,對服務器造成壓力。

(4)加入緩存

加入redis緩存來提升性能。

(5)引入消息隊列

用消息隊列來進行削峯,也可以用於保證數據的一致性。

3. nginx如何限流?限流算法有哪些?

令牌桶算法:維護一個令牌桶,勻速往裏面放令牌,請求來了之後,拿一個令牌纔可以得到處理。如果令牌桶滿了,則丟棄,如果沒有了,則將多餘的請求先緩存。

漏桶算法:一個裝水的桶表示隊列,漏出的水錶示進行處理的,裏面的水錶示請求,溢出的請求可以直接丟棄,也可以用另一個東西緩存一點。

nginx使用的漏桶算法進行限流。

nginx主要有兩個配置:

limit_req_zone 用來限制單位時間內的請求數。

limit_conn_zone限制單個IP的請求數。

(1)limit_req_zone

http {
    //$binary_remote_addr 表示通過remote_addr這個標識來做限制,“binary_”的目的是縮寫內存佔用量,是限制同一客戶端ip地址。
    //zone=one:10m表示生成一個大小爲10M,名字爲one的內存區域,用來存儲訪問的頻次信息。
    //rate=1r/s表示允許相同標識的客戶端的訪問頻次,這裏限制的是每秒1次
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
    server {
        //限制攔截的url
        //zone=one 設置使用哪個配置區域來做限制,與上面limit_req_zone 裏的name對應。
        //設置一個大小爲5的緩衝區當有大量請求(爆發)過來時,超過了訪問頻次限制的請求可以先放到這個緩衝區內。
        //設置,超過訪問頻次而且緩衝區也滿了的時候就會直接返回503,如果沒有設置,則所有請求會等待排隊。
        location /search/ {
            limit_req zone=one burst=5 nodelay;
        }
} 

同時nginx也可以限制搜索引擎,打印日誌,設置拒絕返回值。

(2)limit_conn_zone

limit_conn_zone $binary_remote_addr zone=addr:10m;

server {
    location /download/ {
        //一次只允許每個IP地址一個連接。
        limit_conn addr 1;
    }

4. java中的unsafe類?

unsafe類可以直接操作內存,不受jvm管理,也就意味着無法被GC,需要我們手動GC,稍有不慎就會出現內存泄漏。直接操作內存,也意味着其速度更快,在高併發的條件之下能夠很好地提高效率。

裏面比較重要的就是內存屏障和CAS的相關方法。

5. 多線程的通信方式?

synchronized的等待喚醒機制wait(),notify()。

reentrantlock的lock(),unlock(),condition的await(),signalAll()

6. juc阻塞隊列?

什麼是阻塞隊列

一個線程從一個空的阻塞隊列中取元素,此時線程會被阻塞直到阻塞隊列中有了元素。當隊列中有元素後,被阻塞的線程會自動被喚醒(不需要我們編寫代碼去喚醒)。這樣提供了極大的方便性。

阻塞隊列的主要種類

ArrayBlockingQueue:基於數組實現的阻塞隊列,先進先出隊列,有界隊列。在創建時必須制定容量大小。並可以指定公平性與非公平性,默認情況下是非公平的,即不保證等待時間最長的隊列最優先能夠訪問隊列。

LinkedBlockingQueue:基於鏈表實現的阻塞隊列,先進先出隊列,有界隊列。在創建時如果不指定容量大小,則默認大小爲Integer.MAX_VALUE。

PriorityBlockingQueue:按照元素的優先級對元素進行排序,按照優先級順序出隊。並且該阻塞隊列爲無界阻塞隊列,即容量沒有上限(源碼中它沒有容器滿的信號標誌)。

DelayQueue:基於PriorityQueue的延時阻塞隊列,無界隊列。DelayQueue中的元素只有當其指定的延遲時間到了,才能夠從隊列中獲取到該元素。因爲DelayQueue是一個無界隊列,所以往隊列中插入數據的操作永遠不會被阻塞,而只有獲取數據的操作纔會被阻塞。

阻塞隊列的主要方法

put方法用來向隊尾存入元素,如果隊列滿,則等待;

take方法用來從隊首取元素,如果隊列爲空,則等待;

offer方法用來向隊尾存入元素,如果隊列滿,則等待一定的時間,當時間期限達到時,如果還沒有插入成功,則返回false;否則返回true;

poll方法用來從隊首取元素,如果隊列空,則等待一定的時間,當時間期限達到時,如果取到,則返回取得的元素;否則返回null。

7. 死鎖的解決方式?

預防死鎖,破壞四個必要條件,破壞其中的一個,死鎖就不能產生。

避免死鎖,加鎖順序,加鎖時限

檢測和解除,檢測到了死鎖可以採用回退的方式解決。

 

 

 

 

 關注微信公衆號,你還有頭髮嗎,獲取更多java軟件開發學習資源,覆蓋java基礎,android,網絡編程,併發編程,mysql,linux,算法,以及C++和python書籍資源。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章