Java架构师教你如何突破瓶颈,持续更新中
1、上下文切換
上下文定義
cpu發(fā)生進(jìn)程或者線程切換時(shí),所依賴的數(shù)據(jù)集合,比如一個(gè)函數(shù)有外部變量,函數(shù)運(yùn)行時(shí),必須獲取外部變量,這些變量值的集合就是上下文。
引發(fā)問題
對(duì)于CPU密集型任務(wù),多線程處理會(huì)發(fā)生上下文切換,會(huì)影響到執(zhí)行速度,如果時(shí)IO密集型,多線程技術(shù)優(yōu)點(diǎn)盡顯。
如何減少上下文切換
- 無鎖并發(fā)編程,鎖的獲取與釋放會(huì)發(fā)生上下文切換,多線程時(shí)會(huì)影響效率。無鎖并發(fā)編程就是將數(shù)據(jù)分塊,每個(gè)線程處理各自模塊。比如LongAdder中部分代碼。
- CAS算法,并發(fā)編程時(shí)通過CAS算法更新數(shù)據(jù),而不必加鎖。如Java的atomic包下的工具類。
- 使用最少線程,減少不必要的線程創(chuàng)建,自定義線程池。
- 使用協(xié)程,在單線程中維護(hù)多任務(wù)調(diào)度,處理任務(wù)間切換,Golang對(duì)于協(xié)程的使用很強(qiáng)大。
2、死鎖
死鎖定義
死鎖是進(jìn)程死鎖的簡稱,是由Dijkstra于1965年研究銀行家算法時(shí)首先提出來的。
系統(tǒng)發(fā)生死鎖現(xiàn)象不僅浪費(fèi)大量的系統(tǒng)資源,甚至導(dǎo)致整個(gè)系統(tǒng)崩潰,帶來災(zāi)難性后果。
產(chǎn)生死鎖原因
- 系統(tǒng)資源不足
- 進(jìn)程推進(jìn)順序不當(dāng)
- 資源分配不合理
死鎖產(chǎn)生的必要條件
- 互斥條件:一個(gè)資源只能被一個(gè)進(jìn)程或者線程使用。
- 請(qǐng)求和保持條件:一個(gè)進(jìn)程或者線程,請(qǐng)求資源的時(shí)候發(fā)生阻塞,對(duì)已經(jīng)獲取的資源保持不放。
- 不可剝奪條件:進(jìn)程或者線程以獲得的資源,在未使用完成時(shí),不能強(qiáng)行剝奪。
- 循環(huán)等待條件:若干進(jìn)程或者線程形成一種頭尾相接的循環(huán)等待的資源關(guān)系。
這四分條件是死鎖產(chǎn)生的必要條件,只要發(fā)生死鎖,這些條件必然成立,而只要上述條件之一不滿足,就不會(huì)發(fā)生死鎖。
如何避免死鎖
Lock接口提供了boolean tryLock(long time, TimeUnit unit) throws InterruptedException方法,該方法可以按照固定時(shí)長等待鎖,因此線程可以在獲取鎖超時(shí)以后,主動(dòng)釋放之前已經(jīng)獲得的所有的鎖。
總結(jié)
我們總是喜歡瞻仰大廠的大神們,但實(shí)際上大神也不過凡人,與菜鳥程序員相比,也就多花了幾分心思,如果你再不努力,差距也只會(huì)越來越大。實(shí)際上,作為程序員,豐富自己的知識(shí)儲(chǔ)備,提升自己的知識(shí)深度和廣度是很有必要的。
送大家一份資料,戳這里免費(fèi)領(lǐng)取
Mybatis源碼解析
Mybatis源碼解析
[外鏈圖片轉(zhuǎn)存中…(img-NEmrPvqX-1624875942009)]
總結(jié)
以上是生活随笔為你收集整理的Java架构师教你如何突破瓶颈,持续更新中的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 现在做一个p2p网站,如果项目前后端分离
- 下一篇: Java校招面试经验汇总,最终入职阿里