Java之高併發

高效併發一直都是面試中的熱門面試題,幾乎每家公司都會提到這個問題,這個問題並沒有什麼標準答案,所以面試官注重於你考慮這個問題的方式與你解決這個問題的思路,下來我分享一下自己的回答思路,如有錯誤請大家在評論區指出。

總體思路

1、硬件優化
2、代碼優化
3、數據庫優化

1、硬件優化

1、“讓計算機併發執行若干個運算任務”與“更充分地利用計算機處理
器的效能”之間的因果關係, 看起來理所當然, 實際上它們之間的關係
並沒有想象中那麼簡單, 其中一個重要的複雜性的來源是絕大多數的運
算任務都不可能只靠處理器“計算”就能完成。 處理器至少要與內存交
互, 如讀取運算數據、 存儲運算結果等, 這個I/O操作就是很難消除的
(無法僅靠寄存器來完成所有運算任務) 。 由於計算機的存儲設備與處
理器的運算速度有着幾個數量級的差距, 所以現代計算機系統都不得不
加入一層或多層讀寫速度儘可能接近處理器運算速度的高速緩存
(Cache) 來作爲內存與處理器之間的緩衝: 將運算需要使用的數據復
制到緩存中, 讓運算能快速進行, 當運算結束後再從緩存同步回內存之
中, 這樣處理器就無須等待緩慢的內存讀寫了。
在這裏插入圖片描述
所以在對硬件進行優化的時候,最主要的就是保證處理器的處理速度與內存的讀寫速度儘可能接近,保證處理器的性能不被浪費。其次纔是對各個硬件進行優化處理,最常見的就是更換最新的存儲設備或者處理器。

2、再就是需要從硬盤讀取數據的時候,與內存直接進行交互的應該首選固態硬盤,因爲固態硬盤的讀寫速度更快,另外還應該在機械硬盤及時存儲一份備份數據,因爲固態硬盤一旦損壞其內部的數據很難找回來,而機械硬盤雖然讀寫速度低一點,但是它就算是損壞了,其內部的數據也可以找回90%以上。

3、其三就是優化服務器的帶寬,因爲服務器可能要同時接收非常大量的請求和要同時發出非常大量的響應,所以這時候就需要有足夠的帶寬來保證數據及時被接收或者發出,避免造成因數據積壓而導致性能底下。

2、代碼優化

1、在代碼優化方面,首當其衝的就是多線程的使用了,因爲多線程充分利用多核CPU的計算能力,通過多線程的形式可以將多核CPU的計算能力發揮到極致,性能得到提升。

2、其次就是對線程池的使用了,線程池有以下優點:

降低資源消耗:重用存在的線程,減少對象創建銷燬的開銷。

提高響應速度:可有效的控制最大併發線程數,提高系統資源的使用率,同時避免過多資源競爭,避免堵塞。當任務到達時,任務可以不需要的等到線程創建就能立即執行。

提高線程的可管理性:線程是稀缺資源,如果無限制的創建,不僅會消耗系統資源,還會降低系統的穩定性,使用線程池可以進行統一的分配,調優和監控。

所以,熟練使用線程池可大大降低資源的消耗和創建線程所消耗的時間,從而提升服務器效率。

3、鎖機制的優化,在多線程的條件下,我們要保證數據的準確性就得加入鎖機制,但是鎖也是可以優化的,比如某個數據讀比較頻繁很少有寫的操作,我們就可以對它使用樂觀鎖。並且,我們可以將數據分段加鎖來提升併發訪問的效率等,這一點大家可以去找一下鎖優化相關的主題來閱讀。

3、數據庫優化

1、數據庫SQL優化
保證查詢語句儘量命中索引從而提升查詢速度,儘量是需要什麼數據查詢什麼數據,不要查詢多段數據之後再進行篩選
2、加入緩存機制
對於緩存我想大家都不陌生,緩存可以讓我們將一些有時效性的、經常訪問的、不便於存儲數據庫等的數據,我們可以將數據存儲在專門的用於緩存的應用程序中,如果有必要,還可以將緩存應用服務器單獨部署,如果數據量過大,我們還可以組成緩存服務器集羣,比如:cache、redis等都是比較專注於緩存數據的。只所以使用緩存,是因爲一是減少數據庫的訪問壓力,二是一般專注於緩存的應用對於數據的讀寫較於數據庫都是非常快的。
3、數據庫讀寫分離
讀寫分離是爲了提供程序的性能,隨着用戶的增加,數據庫的壓力也會越來越大,對數據庫或者SQL的基本優化可能達不到最終的效果,讀寫分離簡單的說是把對數據庫讀和寫的操作分開對應不同的數據庫服務器,這樣能有效地減輕數據庫壓力,也能減輕io壓力。主數據庫提供寫操作,從數據庫提供讀操作。主數據庫提供寫操作,從數據庫提 供讀操作,其實在很多系統中,主要是讀的操作。當主數據庫進行寫操作時,數據要同步到從的數據庫,這樣纔能有效保證數據庫完整性。
4、數據庫活躍數據分離
用微博來舉例,一個大V通常有幾百萬甚至上千萬粉絲,所以他們的數據是要被很多人同時看到的,這樣的數據就可以稱之爲活躍數據,如果用普通用戶的數據處理方法來處理大V的數據就會導致性能底下。所以,我們可以將活躍數據分離出來對他們進行特殊的邏輯處理來提升效率。

以上就是我對高併發問題的一些大體思路,如果有不足或者錯誤的地方歡迎大家在評論區留言。最後爲大家推薦一本有關高併發的書《設計數據密集型應用》。

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