高併發和多執行緒

2021-08-19 23:48:10 字數 1323 閱讀 4340

「高併發和多執行緒」總是被一起提起,給人感覺兩者好像相等,實則高併發 ≠ 多執行緒

多執行緒是完成任務的一種方法,高併發是系統執行的一種狀態,通過多執行緒有助於系統承受高併發狀態的實現。

高併發是一種系統執行過程中遇到的一種「短時間內遇到大量操作請求」的情況,主要發生在web系統集中大量訪問或者socket埠集中性收到大量請求(例如:12306的搶票情況;天貓雙十一活動)。該情況的發生會導致系統在這段時間內執行大量操作,例如對資源的請求,資料庫的操作等。

如果高併發處理不好,不僅僅降低了使用者的體驗度(請求響應時間過長),同時可能導致系統宕機,嚴重的甚至導致oom異常,系統停止工作等。如果要想系統能夠適應高併發狀態,則需要從各個方面進行系統優化,包括,硬體、網路、系統架構、開發語言的選取、資料結構的運用、演算法優化、資料庫優化……而多執行緒只是其中解決方法之一

實現高併發需要考慮:

系統的架構設計,如何在架構層面減少不必要的處理(網路請求,資料庫操作等)

網路拓撲優化減少網路請求時間、如何設計拓撲結構,分布式如何實現?

系統**級別的**優化,使用什麼設計模式來進行工作?哪些類需要使用單例,哪些需要儘量減少new操作?

提高**層面的執行效率、如何選取合適的資料結構進行資料訪問?如何設計合適的演算法?

任務執行方式級別的同非同步操作,在**使用同步,**使用非同步?

jvm調優,是以server模式還是以clien模式執行,如何設定heap、stack、eden的大小,如何選擇gc策略,控制full gc的頻率?

資料庫優化減少查詢修改時間。資料庫的選取?資料庫引擎的選取?資料庫表結構的設計?資料庫索引、觸發器等設計?是否使用讀寫分離?還是需要考慮使用資料倉儲?

快取資料庫的使用,如何選擇快取資料庫?是redis還是memcache? 如何設計快取機制?

資料通訊問題,如何選擇通訊方式?是使用tcp還是udp,是使用長連線還是短連線?nio還是bio?netty、mina還是原生socket?

作業系統選取,是使用winserver還是linux?或者unix?

硬體配置?是8g記憶體還是32g,網絡卡10g還是1g?

…………

以上的這些問題在高併發中都是必須要深入考慮的,就像木桶原理一樣,只要其中的某一方面沒有考慮到,都會造成系統瓶頸,影響整個系統的執行。而高併發問題不僅僅涉及面之廣,同時又要求有足夠的深度!!!

多執行緒在這裡只是在同/非同步角度上解決高併發問題的其中的乙個方法手段,是在同一時刻利用計算機閒置資源的一種方式。

多執行緒在解決高併發問題中所起到的作用就是使計算機的資源在每一時刻都能達到最大的利用率,不至於浪費計算機資源使其閒置。

多執行緒高併發

修飾靜態方法鎖的是class,非靜態鎖方法鎖的是this,只有拿到這個物件才可以繼續執行 synchronized是可重入鎖 執行緒1的方法1呼叫執行緒2的方法2,判斷是同一把鎖,在同乙個執行緒,可以呼叫。synchronized的鎖公升級 hotsport 鎖公升級過程 保證執行緒可見性 mesi...

多執行緒高併發

個人總結,帶有個人主觀,請選擇性 1,實現 runable 2,使用 thread 3,執行緒池建立 executorse newcachedthreadpool 其實哪有那麼多建立方式,本質上都是實現了runable 介面。只列出大部分使用的方法,並未代表所有執行緒方法,後續會新增實際的例子,以供...

多執行緒與高併發

blocked 鎖池 timed waiting 定時等待 waiting 等待 terminated 禁止指令重排序 記憶體屏障 在單例雙重檢查中,不加會出現使用半初始化的值,也就是還未附初始值,指令重排導致的 類載入與指令重排的知識 public class spinlock while fla...