Java基礎(chǔ)之并發(fā)相關(guān)知識(shí)總結(jié)
一、Java并發(fā)是什么?
用學(xué)術(shù)定義來(lái)說(shuō)就是
并發(fā):同一時(shí)間段,多個(gè)任務(wù)都在執(zhí)行 (單位時(shí)間內(nèi)不一定同時(shí)執(zhí)行);
簡(jiǎn)單來(lái)說(shuō)就是,同一個(gè)時(shí)間段,讓計(jì)算機(jī)同時(shí)做多個(gè)事情。
說(shuō)到并發(fā),不得不提就是并行:
并行:?jiǎn)挝粫r(shí)間內(nèi),多個(gè)任務(wù)同時(shí)執(zhí)行。
兩者大眼一看很像,仔細(xì)一想?yún)s并不相同,因?yàn)?code>并行強(qiáng)調(diào)某個(gè)時(shí)間點(diǎn)多個(gè)任務(wù)同時(shí)執(zhí)行,而并發(fā)強(qiáng)調(diào)的是一個(gè)時(shí)間段內(nèi)多個(gè)任務(wù)都在執(zhí)行。
二、怎么做?
大部分并發(fā)問(wèn)題,最終都可以抽象成三類(lèi)問(wèn)題分工、同步和互斥。而且針對(duì)不同的問(wèn)題有著不同的方式來(lái)解決,具體如下圖所示:

三、分工
所謂分工,類(lèi)似于現(xiàn)實(shí)中一個(gè)組織完成一個(gè)項(xiàng)目,項(xiàng)目經(jīng)理要拆分任務(wù),安排合適的成員去完成。
在并發(fā)編程領(lǐng)域,你就是項(xiàng)目經(jīng)理,線(xiàn)程就是項(xiàng)目組成員。任務(wù)分解和分工對(duì)于項(xiàng)目成敗非常關(guān)鍵,不過(guò)在并發(fā)領(lǐng)域里,分工更重要,它直接決定了并發(fā)程序的性能,并且分工非常重要且復(fù)雜,因而Java并發(fā)包中有一系列方法來(lái)實(shí)現(xiàn)分工:
- “Executor與線(xiàn)程池”
- “ForkJoin”
- “Future的使用”
基于分工思想設(shè)計(jì)的并發(fā)設(shè)計(jì)模式也有很多:
- “Guarded Supension模式”
- “Balking模式”
- “Threa-Per-Message模式”
- “生產(chǎn)者-消費(fèi)者模式”
- “Work Thread模式”
- “兩階段終止模式”
四、同步
而同步更多描述的是一種協(xié)同關(guān)系,在分完工之后,具體執(zhí)行時(shí),任務(wù)之間會(huì)有依賴(lài),一個(gè)任務(wù)之后完成之后,其他依賴(lài)它的任務(wù)才能開(kāi)始進(jìn)行,因而就引入的同步來(lái)協(xié)同各個(gè)任務(wù)之間的執(zhí)行順序。
針對(duì)該類(lèi)問(wèn)題,Java也提供了一系列工具來(lái)輔助解決:
- “信號(hào)量(Semaphore)機(jī)制”
- “管程(Monitor)”
- “CountDownLatch”
- “CyclicBarrier”
- “Phaser”
- “Exchanger”
五、互斥
分工、同步主要為了充分發(fā)掘CPU的性能來(lái)解決問(wèn)題,但并發(fā)問(wèn)題中,還需要解決正確性問(wèn)題,即保證線(xiàn)程安全。
當(dāng)多個(gè)線(xiàn)程同時(shí)訪同一個(gè)變量時(shí),最后執(zhí)行的結(jié)果是不確定的,比如下邊這段代碼:
public class UnsafeSequence {
private int value = 0;
public int getNext() {
return ++value;
}
}
如果我們有多個(gè)線(xiàn)程同時(shí)調(diào)用getNext()時(shí),多個(gè)線(xiàn)程之間推進(jìn)順序的不同可能會(huì)有不同的執(zhí)行結(jié)果:
可能會(huì)是2,遞推順序如下:

可能結(jié)果是1,代碼執(zhí)行順序如下:

因而結(jié)果是不確定的,也就是說(shuō)結(jié)果可能是正確的(比如上邊的程序執(zhí)行結(jié)果為2),可能是錯(cuò)誤的(比如執(zhí)行結(jié)果是1),執(zhí)行前是不知道的。而導(dǎo)致不確定的主要源頭主要是三個(gè)問(wèn)題可見(jiàn)性問(wèn)題、有序性問(wèn)題和原子性問(wèn)題,為了解決這三個(gè)問(wèn)題,Java引入了內(nèi)存模型,內(nèi)存模型提供一系列規(guī)則利用這些規(guī)則,我們可以避免可見(jiàn)性問(wèn)題、有序性問(wèn)題,但是還不足以完全解決線(xiàn)程安全問(wèn)題。解決線(xiàn)程安全問(wèn)題的核心方案還是互斥。
所謂互斥,指的是同一時(shí)刻,只允許一個(gè)線(xiàn)程訪問(wèn)共享變量。
實(shí)現(xiàn)互斥主要手段是互斥鎖主要包含下邊這些手段:
- Synchronized
- Lock
- 讀寫(xiě)鎖
除此之外,未來(lái)提高速度,也有一些無(wú)鎖的方案:
- 不變模式
- 線(xiàn)程本地存儲(chǔ)
- CAS
- Copy - on - Write
- 原子類(lèi)
六、總結(jié)
本文主要從分工、同步和互斥三類(lèi)問(wèn)題展開(kāi),從解決對(duì)應(yīng)問(wèn)題角度出發(fā)大致梳理了Java并發(fā)知識(shí)的學(xué)習(xí)前景圖。后續(xù)將分若干部分來(lái)講對(duì)應(yīng)的內(nèi)容。
到此這篇關(guān)于Java基礎(chǔ)之并發(fā)相關(guān)知識(shí)總結(jié)的文章就介紹到這了,更多相關(guān)Java并發(fā)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java 實(shí)現(xiàn)并發(fā)的幾種方式小結(jié)
- Java并發(fā)編程之ConcurrentLinkedQueue源碼詳解
- JAVA并發(fā)中VOLATILE關(guān)鍵字的神奇之處詳解
- Java并發(fā)編程之CountDownLatch源碼解析
- Java并發(fā)編程之線(xiàn)程之間的共享和協(xié)作
- Java并發(fā)編程之Exchanger方法詳解
- java關(guān)于并發(fā)模型中的兩種鎖知識(shí)點(diǎn)詳解
- 如何使用JCTools實(shí)現(xiàn)Java并發(fā)程序
- Java并發(fā)編程之ReadWriteLock讀寫(xiě)鎖的操作方法
- Java并發(fā)(Runnable+Thread)實(shí)現(xiàn)硬盤(pán)文件搜索功能
- Java高并發(fā)BlockingQueue重要的實(shí)現(xiàn)類(lèi)詳解
相關(guān)文章
Java CRM系統(tǒng)用戶(hù)登錄功能實(shí)現(xiàn)代碼實(shí)例
這篇文章主要介紹了Java CRM系統(tǒng)用戶(hù)登錄功能實(shí)現(xiàn)代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
elasticsearch索引index數(shù)據(jù)功能源碼示例
這篇文章主要為大家介紹了elasticsearch索引index功能源碼示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04
Java中繼承thread類(lèi)與實(shí)現(xiàn)Runnable接口的比較
這篇文章主要介紹了Java中繼承thread類(lèi)與實(shí)現(xiàn)Runnable接口的比較的相關(guān)資料,需要的朋友可以參考下2017-06-06
Spring Boot整合MyBatis連接Oracle數(shù)據(jù)庫(kù)的步驟全紀(jì)錄
這篇文章主要給大家介紹了關(guān)于Spring Boot整合MyBatis連接Oracle數(shù)據(jù)庫(kù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-07-07
Java簡(jiǎn)化復(fù)雜系統(tǒng)調(diào)用的門(mén)面設(shè)計(jì)模式
Java門(mén)面模式是一種結(jié)構(gòu)性設(shè)計(jì)模式,它為復(fù)雜系統(tǒng)提供了一個(gè)簡(jiǎn)單的接口,使得系統(tǒng)的客戶(hù)端能夠更加方便地使用系統(tǒng)功能。門(mén)面模式通過(guò)封裝復(fù)雜的子系統(tǒng),隱藏系統(tǒng)的實(shí)現(xiàn)細(xì)節(jié),提高了系統(tǒng)的易用性和靈活性2023-04-04
Java設(shè)計(jì)模式之迭代器模式_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Java設(shè)計(jì)模式之迭代器模式_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理,需要的朋友可以參考下2017-08-08
Java多線(xiàn)程的調(diào)度_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
有多個(gè)線(xiàn)程,如何控制它們執(zhí)行的先后次序呢?下文給大家分享四種方法及java多線(xiàn)程調(diào)度的實(shí)例代碼,需要的朋友參考下吧2017-05-05
SpringBoot通過(guò)請(qǐng)求對(duì)象獲取輸入流無(wú)數(shù)據(jù)
這篇文章主要介紹了使用SpringBoot通過(guò)請(qǐng)求對(duì)象獲取輸入流無(wú)數(shù)據(jù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
談?wù)勎覍?duì)Spring Bean 生命周期的理解
Spring Bean 的生命周期在整個(gè) Spring 中占有很重要的位置,掌握這些可以加深對(duì) Spring 的理解。這篇文章主要介紹了Spring Bean 生命周期,需要的朋友可以參考下2018-03-03

