高并发的理解和使用场景-----特意区别和多线程的关系
一,高并發(fā)的理解
? ?1.概念:就是短時間內(nèi)遇到大量操作請求,導(dǎo)致站點服務(wù)器/db服務(wù)器資源被占滿甚至嚴重時直接導(dǎo)致宕
? ?2.影響:沒有做高并發(fā)預(yù)處理的系統(tǒng)會給用戶很差的體驗感;
? ?3.系統(tǒng)好壞的衡量:衡量一個系統(tǒng)的好壞,除了業(yè)務(wù)外,還有就是系統(tǒng)的吞吐量(單位時間內(nèi)處理的請求數(shù))-----QPS(每秒鐘能處理的請求數(shù))和響應(yīng)時間
二,區(qū)分一下高并發(fā)和多線程的關(guān)系----曾經(jīng)我也是單純的理解高并發(fā)就是多線程,錯的很離譜
? ? 1.多線程的理解:
?多線程是java的特性,因為現(xiàn)在cpu都是多核多線程的,可以同時執(zhí)行幾個任務(wù),為了提高jvm的執(zhí)行效率,java提供了這種多線程的機制,以增強數(shù)據(jù)處理效率。
?多線程對應(yīng)的是cpu,高并發(fā)對應(yīng)的是訪問請求,可以用單線程處理所有訪問請求,也可以用多線程同時處理訪問請求。
在過去單CPU時代,單任務(wù)在一個時間點只能執(zhí)行單一程序。之后發(fā)展到多任務(wù)階段,計算機能在同一時間點并行執(zhí)行多任務(wù)或多進程。雖然并不是真正意義上的“同一時間點”,而是多個任務(wù)或進程共享一個CPU,并交由操作系統(tǒng)來完成多任務(wù)間對CPU的運行切換,以使得每個任務(wù)都有機會獲得一定的時間片運行。
再后來發(fā)展到多線程技術(shù),使得在一個程序內(nèi)部能擁有多個線程并行執(zhí)行。一個線程的執(zhí)行可以被認為是一個CPU在執(zhí)行該程序。當(dāng)一個程序運行在多線程下,就好像有多個CPU在同時執(zhí)行該程序
? ?2.多線程和高并發(fā)的關(guān)系
? ? 要想系統(tǒng)能夠適應(yīng)高并發(fā)狀態(tài),則需要從各個方面進行系統(tǒng)優(yōu)化,包括,硬件、網(wǎng)絡(luò)、系統(tǒng)架構(gòu)、開發(fā)語言的選取、數(shù)據(jù)結(jié)構(gòu)的運用、算法優(yōu)化、數(shù)據(jù)庫優(yōu)化等…而多線程只是其中解決方法之一。
? ?3.并發(fā)編程的幾個要素
- ?原子性原子,即一個不可再被分割的顆粒。在Java中原子性指的是一個或多個操作要么全部執(zhí)行成功要么全部執(zhí)行失敗。
- ?有序性程序執(zhí)行的順序按照代碼的先后順序執(zhí)行。(處理器可能會對指令進行重排序)
- ?可見性當(dāng)多個線程訪問同一個變量時,如果其中一個線程對其作了修改,其他線程能立即獲取到最新的值
? ?4.使用多線程技術(shù)編程需要注意的幾個點
? ? ? ?4.1 清楚一個線程的五個狀態(tài)
? ? ? ?4.2 理解悲觀鎖和樂觀鎖?
? ? ? ?4.3懂線程之間的協(xié)作(wait/sleep/notify等)
? ? ? ?4.4 知道什么時候使用線程池
? ?5.高并發(fā)的場景
? ? ? 一般像火車票搶票,秒殺 系統(tǒng),雙11或者京東618活動等這種太明顯不過了,這種還是正常的業(yè)務(wù)范圍,蠻好理解的,還有一種就是惡意的攻擊,導(dǎo)致系統(tǒng)的某個功能近乎癱瘓,比如驗證碼的請求等,
? ? ? 假設(shè)系統(tǒng)的一些架構(gòu)方便的并發(fā)措施都做到位了,例如,重要系統(tǒng)配備了好的資源(高質(zhì)量服務(wù)器),同時使用集群方式提供服務(wù),增加了redis集群配置等,最后需要處理的就是底層數(shù)據(jù)庫那塊了,
? ? ?不然前面那么多請求都吃下來了,到了底層掉鏈子跟不上那也不行:
? ? ?在此,個人理解為并發(fā)無非就是并發(fā)讀和并發(fā)寫,并發(fā)讀還好,一般使用緩存就可以搞定,并發(fā)寫技術(shù)就比較多了;
? ? ?一般我們都知道 并發(fā)時最怕的就是對共享變量的同時訪問導(dǎo)致臟數(shù)據(jù)的產(chǎn)生,所以一般會加鎖:對象鎖(例如:syncrinized等關(guān)鍵字)和 分布式鎖(數(shù)據(jù)庫鎖,redis,zookeeper)
? ? 對象鎖顧名思義就是鎖住當(dāng)前對象--只能用在單服務(wù)器上,對于分布式系統(tǒng)或者單系統(tǒng)分布式部署時對共享資源的訪問就必須使用分布式鎖了,此時對象鎖沒法用了?
? ? 像秒殺系統(tǒng)可以使用緩存讓還有數(shù)量時都可以看到,而在開搶后得看個人運氣了(網(wǎng)絡(luò)等原因),此時使用樂觀鎖(共享鎖)就搞定了嘛
? ? 像銀行的消費后更新銀行卡余額,使用悲觀鎖(排斥鎖)就可以
? ? 具體想搞清楚分布式鎖的請看下面這個鏈接:https://www.cnblogs.com/toutou/archive/2018/09/24/9554974.html
? ? ?
? ?6.高并發(fā)的技術(shù)解決方案
? ? ??
? ??
? ? ?a.分布式緩存:redis、memcached等,
? ? ?b.系統(tǒng)采用水平方向擴展,盡量使用集群來分散處理多請求。
? ? ?c.應(yīng)用拆分:一個工程被拆分為多個工程部署,利用dubbo解決多工程之間的通信。
? ? ?d.數(shù)據(jù)庫分庫分表等。
? ? ?e .數(shù)據(jù)庫讀寫分離,解決大數(shù)據(jù)的查詢問題。
? ? ?f.還可以利用nosql ,例如mongoDB配合mysql組合使用。
? ? g.還需要建立大數(shù)據(jù)訪問情況下的服務(wù)降級以及限流機制等。
? ? h.消息隊列中間件:activeMQ等,解決大量消息的異步處理能力。
? ? .............
? ??
? ??
?
轉(zhuǎn)載于:https://www.cnblogs.com/feichen-66/p/11207847.html
總結(jié)
以上是生活随笔為你收集整理的高并发的理解和使用场景-----特意区别和多线程的关系的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我看面向对象
- 下一篇: 实现div可以调整高度(div实现res