淺談Java線程并發(fā)知識(shí)點(diǎn)
發(fā)布:一個(gè)對(duì)象是使它能夠被當(dāng)前范圍之外的代碼所引用:
常見形式:將對(duì)象的的引用存儲(chǔ)到公共靜態(tài)域;非私有方法中返回引用;發(fā)布內(nèi)部類實(shí)例,包含引用。
逃逸:在對(duì)象尚未準(zhǔn)備好時(shí)就將其發(fā)布。
不要讓this引用在構(gòu)造函數(shù)中逸出。例,在構(gòu)造函數(shù)中啟動(dòng)線程,線程會(huì)包含對(duì)象的引用。
同步容器:對(duì)容器的所有狀態(tài)進(jìn)行穿行訪問(wèn),Vector、Hashtable,Cllections.synchronizedMap|List
并發(fā)容器:ConcurrentHashMap,CopyOnWriteArrayList,ConcurrentLinkedQueue、BlockingQueue
list 隨機(jī)訪問(wèn)特性的優(yōu)勢(shì)。
Blocking 增加了可阻塞的get set操作
ConcurrentHashMap:分離鎖,為并發(fā)訪問(wèn)帶來(lái)的高的吞吐量,同時(shí)幾乎沒有損失單個(gè)線程的訪問(wèn)性能。返回弱一致性的迭代器。
迭代器的弱一致性,在迭代器生成以后會(huì)檢測(cè)容器的修改變化。
并發(fā)容器 size(), isEmpty() 弱化,返回近似結(jié)果。
CopyOnWriteArrayList:每次修改容器時(shí)復(fù)制,適用迭代需求大于修改需求情況。
生產(chǎn)者消費(fèi)者模式,運(yùn)用有界阻塞隊(duì)列解耦生產(chǎn)者和消費(fèi)者的代碼。
Executor任務(wù)執(zhí)行框架,實(shí)現(xiàn)了生產(chǎn)者消費(fèi)者模式。
SynchronousQueue:put等待消費(fèi)者可用,take等待生產(chǎn)者可用,適用于消費(fèi)者充足的情景。
雙端隊(duì)列(deque)關(guān)聯(lián)于竊取工作模式(work stealing),區(qū)別于生產(chǎn)者消費(fèi)者模式中所有消費(fèi)者共享一個(gè)工作隊(duì)列,工作竊取模式每一個(gè)消費(fèi)者都有自己的雙端隊(duì)列,如果一個(gè)消費(fèi)者完成自己的全部工作,就可以偷取其它消費(fèi)者隊(duì)列隊(duì)尾的任務(wù)。
工作竊取模式適用于當(dāng)運(yùn)行到一個(gè)任務(wù)的某一個(gè)單元時(shí),可能會(huì)識(shí)別出更多的任務(wù),如遍歷文件。
當(dāng)一個(gè)方法能夠拋出InterruptedException時(shí),說(shuō)明它是可阻塞方法。拋出或捕獲InterruptedException。
Synchronizer:同步者---semaphore、barrier、latch,封裝狀態(tài),決定線程在此狀態(tài)下的行為(通過(guò)或阻塞),提供操控狀態(tài)的方法,高效的等待同步者進(jìn)入期望的狀態(tài)。
latch閉鎖:延遲線程進(jìn)度直到線程到達(dá)一個(gè)終點(diǎn)狀態(tài),像一個(gè)一次性開關(guān)??梢杂脕?lái)確保特定活動(dòng)直到其它活動(dòng)完成才發(fā)生。
例如:
- 確保一個(gè)計(jì)算不會(huì)被執(zhí)行,直到需要的資源都被初始化。
- 確保一個(gè)服務(wù)不會(huì)被開始,直到依賴的其它服務(wù)已經(jīng)開始。
- 等待,直到活動(dòng)的所有部分都為繼續(xù)處理做好準(zhǔn)備。
FutureTask可以作為閉鎖,抽象的可攜帶結(jié)果的計(jì)算,通過(guò)callable實(shí)現(xiàn)。Future.get依賴于任務(wù)的執(zhí)行狀態(tài),任務(wù)運(yùn)行完成則返回結(jié)果,否則一直等待,
Executor框架利用FutureTask完成異步任務(wù)。
semapher信號(hào)量:用來(lái)控制能夠同時(shí)訪問(wèn)某特定資源的活動(dòng)數(shù)量或同時(shí)執(zhí)行某一給定操作的數(shù)量,資源池,容器邊界。
barrier關(guān)卡:類似于閉鎖,區(qū)別所有的線程必須同時(shí)到達(dá)關(guān)卡,才能繼續(xù)處理,閉鎖等待的是時(shí)間,關(guān)卡等待的是其它線程,重復(fù)使用。通過(guò)關(guān)卡,await會(huì)為每一個(gè)線程返回唯一的到達(dá)索引號(hào),可以用它來(lái)選舉產(chǎn)生一個(gè)領(lǐng)導(dǎo),在下一次迭代中承擔(dān)一些特殊任務(wù)。
Exchanger一種關(guān)卡的形式。
以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,同時(shí)也希望多多支持腳本之家!
相關(guān)文章
Java微信公眾平臺(tái)開發(fā)(7) 公眾平臺(tái)測(cè)試帳號(hào)的申請(qǐng)
這篇文章主要為大家詳細(xì)介紹了Java微信公眾平臺(tái)開發(fā)第七步,微信公眾平臺(tái)測(cè)試帳號(hào)的申請(qǐng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04
超個(gè)性修改SpringBoot項(xiàng)目的啟動(dòng)banner的方法
這篇文章主要介紹了超個(gè)性修改SpringBoot項(xiàng)目的啟動(dòng)banner的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
java awt實(shí)現(xiàn)計(jì)算器功能
這篇文章主要為大家詳細(xì)介紹了java awt實(shí)現(xiàn)計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12
pageHelper分頁(yè)失效問(wèn)題及解決方案
文章介紹了Mybatis分頁(yè)插件pageHelper的一個(gè)bug,即在一對(duì)多查詢時(shí)會(huì)出現(xiàn)分頁(yè)錯(cuò)誤,作者提供了解決方案,包括方案一、方案二和方案三,方案一通過(guò)在服務(wù)層進(jìn)行額外查詢來(lái)解決分頁(yè)問(wèn)題,方案二利用mybatis的嵌套子查詢來(lái)解決,但可能產(chǎn)生'1+N'問(wèn)題2025-01-01
淺談Ribbon、Feign和OpenFeign的區(qū)別
這篇文章主要介紹了淺談Ribbon、Feign和OpenFeign的區(qū)別。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
IDEA2023.3.4開啟SpringBoot項(xiàng)目的熱部署(圖文)
本文使用的開發(fā)工具是idea,使用的是springboot框架開發(fā)的項(xiàng)目,配置熱部署,可以提高開發(fā)效率,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-02-02
Java中byte輸出write到文件的實(shí)現(xiàn)方法講解
今天小編就為大家分享一篇關(guān)于Java中byte輸出write到文件的實(shí)現(xiàn)方法講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-03-03

