Java編程思想中關(guān)于并發(fā)的總結(jié)
知識(shí)點(diǎn)摘抄
1、用并發(fā)解決的問(wèn)題大體上可以分為“速度”和“設(shè)計(jì)可管理性”兩種。
2、并發(fā)通常是提高運(yùn)行在單處理器上的程序的性能。
這聽起來(lái)有些違背直覺(jué)。如果你仔細(xì)考慮一下就會(huì)發(fā)現(xiàn),在單處理器上運(yùn)行的并發(fā)程序開銷確實(shí)應(yīng)該比該程序的所有部分都順序執(zhí)行的開銷大,因?yàn)槠渲性黾恿怂^上下文切換的代價(jià)(從一個(gè)任務(wù)切換到另一個(gè)任務(wù))。
使這個(gè)問(wèn)題變得有些不同的是阻塞。如果程序中的某個(gè)任務(wù)因?yàn)樵摼€程控制之外的某些條件(通常是I/O)而導(dǎo)致不能繼續(xù)執(zhí)行,那么我們就說(shuō)這個(gè)任務(wù)或線程阻塞了。如果沒(méi)有并發(fā),則整個(gè)程序都將停止下來(lái),直至外部條件發(fā)生變化。但是如果使用并發(fā)來(lái)編寫
程序,那么當(dāng)一個(gè)任務(wù)阻塞時(shí),程序中的其他任務(wù)還能繼續(xù)執(zhí)行,因此這個(gè)程序可以保持繼續(xù)向前執(zhí)行。事實(shí)上,從性能的角度看,如果沒(méi)有任務(wù)會(huì)阻塞,那么在單處理器機(jī)器上使用并發(fā)就沒(méi)有任何意義。
3、實(shí)現(xiàn)并發(fā)最直接的方式是在操作系統(tǒng)級(jí)別使用進(jìn)程。進(jìn)程是運(yùn)行在它自己的地址空間內(nèi)的自包容的程序。
4、操作系統(tǒng)通常會(huì)將進(jìn)程互相隔離開,因此他們不會(huì)彼此干涉,這使得用進(jìn)程編程相對(duì)容易一些。與此相反的是,像Java所使用的這種并發(fā)系統(tǒng)會(huì)共享諸如內(nèi)存和I/O這樣的資源,因此編寫多線程程序最基本的困難在于在協(xié)調(diào)不同線程驅(qū)動(dòng)的任務(wù)之間的對(duì)這些資
源的使用,以使得這些資源不會(huì)同時(shí)被多個(gè)任務(wù)訪問(wèn)。
5、Java的線程機(jī)制是搶占式的,這表示調(diào)度機(jī)制會(huì)周期性的中斷線程,將上下文切換到另一個(gè)線程,從而為每個(gè)線程都提供時(shí)間片,使得每個(gè)線程都會(huì)分配到數(shù)量合理的的時(shí)間去驅(qū)動(dòng)它的任務(wù)。
6、一個(gè)線程就是在進(jìn)程中的一個(gè)單一的順序控制流,因此,單個(gè)進(jìn)程可以擁有多個(gè)并發(fā)執(zhí)行的任務(wù)。
知識(shí)點(diǎn)擴(kuò)展
發(fā)布:一個(gè)對(duì)象是使它能夠被當(dāng)前范圍之外的代碼所引用:
常見(jiàn)形式:將對(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í)幾乎沒(méi)有損失單個(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)者充足的情景。
以上就是本次介紹的全部知識(shí)點(diǎn)內(nèi)容,感謝大家的學(xué)習(xí)和對(duì)腳本之家的支持。
相關(guān)文章
Spring 中使用Quartz實(shí)現(xiàn)任務(wù)調(diào)度
這篇文章主要介紹了Spring 中使用Quartz實(shí)現(xiàn)任務(wù)調(diào)度,Spring中使用Quartz 有兩種方式,感興趣的小伙伴們可以參考一下。2017-02-02checkpoint 機(jī)制具體實(shí)現(xiàn)示例詳解
這篇文章主要為大家介紹了checkpoint 機(jī)制具體實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02Java微服務(wù)之Feign遠(yuǎn)程調(diào)用方式
這篇文章主要介紹了Java微服務(wù)之Feign遠(yuǎn)程調(diào)用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05淺析Spring Boot單體應(yīng)用熔斷技術(shù)的使用
這篇文章主要介紹了淺析Spring Boot單體應(yīng)用熔斷技術(shù)的使用,幫助大家更好的理解和使用spirngboot框架,感興趣的朋友可以了解下2021-01-01Spring?Boot+RabbitMQ?通過(guò)fanout模式實(shí)現(xiàn)消息接收功能(支持消費(fèi)者多實(shí)例部署)
這篇文章主要介紹了Spring?Boot+RabbitMQ?通過(guò)fanout模式實(shí)現(xiàn)消息接收(支持消費(fèi)者多實(shí)例部署),本文通過(guò)案例場(chǎng)景分析給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03Java對(duì)象傳遞與返回的細(xì)節(jié)問(wèn)題詳析
我們知道這是一個(gè)核心概念,在Java中總是按值傳遞而不是按引用傳遞,下面這篇文章主要給大家介紹了關(guān)于Java對(duì)象傳遞與返回的細(xì)節(jié)問(wèn)題的相關(guān)資料,需要的朋友可以參考下2022-11-11SpringBoot配置主從數(shù)據(jù)庫(kù)實(shí)現(xiàn)讀寫分離
現(xiàn)在的 Web 應(yīng)用大都是讀多寫少,本文主要介紹了SpringBoot配置主從數(shù)據(jù)庫(kù)實(shí)現(xiàn)讀寫分離,具有一定的參考價(jià)值,感興趣的可以了解一下2023-11-11