學習高併發首先要理解高併發的概念。併發是可使用多個線程或者多個進程,同時處理不一樣的操做。簡單的說來就是隻同一個功能,或者說對同一條數據的更改多是不少我的同時進行。那麼此時就會存在數據不一樣步而致使保持了錯誤的數據到數據庫。好比4個管理員對同一個對一個用戶的餘額進行修改。主要的話仍是要從數據庫加鎖上來解決。通常都是行級讀鎖,即在一個時刻只能有一我的拿取此條數據進行修改,待修改完成後提交在釋放鎖供下一我的獲取數據。尚學堂張老師爲咱們總結了高併發系統的設計和處理方法,簡單與你們分享。html
高併發系統的設計須要注意一下幾點:web
儘可能使用緩存,包括用戶緩存,信息緩存等,多花點內存來作緩存,能夠大量減小與數據庫的交互,提升性能。數據庫
用jprofiler等工具找出性能瓶頸,減小額外的開銷。編程
優化數據庫查詢語句,減小直接使用hibernate等工具的直接生成語句(僅耗時較長的查詢作優化)。緩存
優化數據庫結構,多作索引,提升查詢效率。安全
統計的功能儘可能作緩存,或按天天一統計或定時統計相關報表,避免須要時進行統計的功能。服務器
能使用靜態頁面的地方儘可能使用,減小容器的解析(儘可能將動態內容生成靜態html來顯示)。併發
解決以上問題後,使用服務器集羣來解決單臺的瓶頸問題。編程語言
基本上以上述問題解決後,達到系統最優。高併發
若是低層的鏈接數過大(如大量的端口占用需求),這種狀況下考慮直接C來寫,其餘的能夠用Java來作。
那麼用Java語言如何處理高併發狀況呢?下面簡單表述一下:
1.背景描述
併發就是可使用多個線程同時處理不一樣的操做。
高併發的時候就是有不少用戶訪問,致使系統數據不正確。對於大型網站,好比門戶網站。在面對大量用戶訪問,高併發請求方面,基本的解決方案集中在這樣幾個環節,使用高性能的服務器,高性能的編程語言,還有高性能的web容器,這幾個解決思路意味着須要投入大量的。
使用通常的snchronized或者lock 或者隊列都是沒法知足高併發的狀況。
解決方法有三種:
1.使用緩存
2.使用生成靜態頁面
html純靜態頁面是效率最高,消耗最小的頁面。
3.圖片與服務器分離
4.代碼構造的時候儘可能避免沒必要要的資源浪費
<1>不要頻繁的使用new對象,對於在整個應用中只須要存在一個實例的類使用單例模式。對於string的鏈接操做,使用stringbuffer或者stringbuilder。對於utility類型的類經過靜態方法來訪問;
<2>避免使用錯誤的方式,如exception能夠控制方法推出,可是Exception要保留stacktrace消耗性能,除非必要不要使用instanceof作條件判斷,儘可能使用比的條件判斷方式。使用Java中效率高的類,好比arraylist比vector快;
<3>使用線程安全的集合對象;
<4>使用線程池。