Java基礎(chǔ)之并發(fā)相關(guān)知識總結(jié)
一、Java并發(fā)是什么?
用學(xué)術(shù)定義來說就是
并發(fā):同一時間段,多個任務(wù)都在執(zhí)行 (單位時間內(nèi)不一定同時執(zhí)行);
簡單來說就是,同一個時間段,讓計算機(jī)同時做多個事情。
說到并發(fā)
,不得不提就是并行
:
并行:單位時間內(nèi),多個任務(wù)同時執(zhí)行。
兩者大眼一看很像,仔細(xì)一想?yún)s并不相同,因為并行
強(qiáng)調(diào)某個時間點(diǎn)多個任務(wù)同時執(zhí)行,而并發(fā)
強(qiáng)調(diào)的是一個時間段內(nèi)多個任務(wù)都在執(zhí)行。
二、怎么做?
大部分并發(fā)問題,最終都可以抽象成三類問題分工、同步和互斥。而且針對不同的問題有著不同的方式來解決,具體如下圖所示:
三、分工
所謂分工
,類似于現(xiàn)實中一個組織完成一個項目,項目經(jīng)理要拆分任務(wù),安排合適的成員去完成。
在并發(fā)編程領(lǐng)域,你就是項目經(jīng)理,線程就是項目組成員。任務(wù)分解和分工對于項目成敗非常關(guān)鍵,不過在并發(fā)領(lǐng)域里,分工更重要,它直接決定了并發(fā)程序的性能,并且分工非常重要且復(fù)雜,因而Java并發(fā)包中有一系列方法來實現(xiàn)分工
:
- “Executor與線程池”
- “ForkJoin”
- “Future的使用”
基于分工思想設(shè)計的并發(fā)設(shè)計模式也有很多:
- “Guarded Supension模式”
- “Balking模式”
- “Threa-Per-Message模式”
- “生產(chǎn)者-消費(fèi)者模式”
- “Work Thread模式”
- “兩階段終止模式”
四、同步
而同步
更多描述的是一種協(xié)同關(guān)系,在分完工之后,具體執(zhí)行時,任務(wù)之間會有依賴,一個任務(wù)之后完成之后,其他依賴它的任務(wù)才能開始進(jìn)行,因而就引入的同步
來協(xié)同各個任務(wù)之間的執(zhí)行順序。
針對該類問題,Java也提供了一系列工具來輔助解決:
- “信號量(Semaphore)機(jī)制”
- “管程(Monitor)”
- “CountDownLatch”
- “CyclicBarrier”
- “Phaser”
- “Exchanger”
五、互斥
分工、同步主要為了充分發(fā)掘CPU的性能來解決問題,但并發(fā)問題中,還需要解決正確性問題,即保證線程安全
。
當(dāng)多個線程同時訪同一個變量時,最后執(zhí)行的結(jié)果是不確定的,比如下邊這段代碼:
public class UnsafeSequence { private int value = 0; public int getNext() { return ++value; } }
如果我們有多個線程同時調(diào)用getNext()
時,多個線程之間推進(jìn)順序的不同可能會有不同的執(zhí)行結(jié)果:
可能會是2,遞推順序如下:
可能結(jié)果是1,代碼執(zhí)行順序如下:
因而結(jié)果是不確定的,也就是說結(jié)果可能是正確的(比如上邊的程序執(zhí)行結(jié)果為2),可能是錯誤的(比如執(zhí)行結(jié)果是1),執(zhí)行前是不知道的。而導(dǎo)致不確定的主要源頭主要是三個問題可見性問題、有序性問題和原子性問題,為了解決這三個問題,Java引入了內(nèi)存模型,內(nèi)存模型提供一系列規(guī)則利用這些規(guī)則,我們可以避免可見性問題、有序性問題,但是還不足以完全解決線程安全問題。解決線程安全問題的核心方案還是互斥
。
所謂互斥,指的是同一時刻,只允許一個線程訪問共享變量。
實現(xiàn)互斥主要手段是互斥鎖主要包含下邊這些手段:
- Synchronized
- Lock
- 讀寫鎖
除此之外,未來提高速度,也有一些無鎖的方案:
- 不變模式
- 線程本地存儲
- CAS
- Copy - on - Write
- 原子類
六、總結(jié)
本文主要從分工、同步和互斥三類問題展開,從解決對應(yīng)問題角度出發(fā)大致梳理了Java并發(fā)知識的學(xué)習(xí)前景圖。后續(xù)將分若干部分來講對應(yīng)的內(nèi)容。
到此這篇關(guān)于Java基礎(chǔ)之并發(fā)相關(guān)知識總結(jié)的文章就介紹到這了,更多相關(guān)Java并發(fā)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java 實現(xiàn)并發(fā)的幾種方式小結(jié)
- Java并發(fā)編程之ConcurrentLinkedQueue源碼詳解
- JAVA并發(fā)中VOLATILE關(guān)鍵字的神奇之處詳解
- Java并發(fā)編程之CountDownLatch源碼解析
- Java并發(fā)編程之線程之間的共享和協(xié)作
- Java并發(fā)編程之Exchanger方法詳解
- java關(guān)于并發(fā)模型中的兩種鎖知識點(diǎn)詳解
- 如何使用JCTools實現(xiàn)Java并發(fā)程序
- Java并發(fā)編程之ReadWriteLock讀寫鎖的操作方法
- Java并發(fā)(Runnable+Thread)實現(xiàn)硬盤文件搜索功能
- Java高并發(fā)BlockingQueue重要的實現(xiàn)類詳解
相關(guān)文章
Java基于面向?qū)ο髮崿F(xiàn)一個戰(zhàn)士小游戲
這篇文章主要為大家詳細(xì)介紹了Java如何基于面向?qū)ο髮崿F(xiàn)一個戰(zhàn)士小游戲,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以動手嘗試一下2022-07-07java多線程之并發(fā)工具類CountDownLatch,CyclicBarrier和Semaphore
這篇文章主要為大家介紹了java并發(fā)工具類CountDownLatch,CyclicBarrier和Semaphore ,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2021-12-12結(jié)合線程池實現(xiàn)apache?kafka消費(fèi)者組的誤區(qū)及解決方法
這篇文章主要介紹了結(jié)合線程池實現(xiàn)apache?kafka消費(fèi)者組的誤區(qū)及解決方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-07-07Springboot?整合maven插口調(diào)用maven?release?plugin實現(xiàn)一鍵打包功能
這篇文章主要介紹了Springboot?整合maven插口調(diào)用maven?release?plugin實現(xiàn)一鍵打包功能,整合maven-invoker使程序去執(zhí)行mvn命令,結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-03-03Java中String、StringBuffer和StringBuilder的區(qū)別
這篇文章主要介紹了Java中String、StringBuffer和StringBuilder的區(qū)別,StringBuilder與StringBuffer都繼承自AbstractStringBuilder類,在AbstractStringBuilder中也是使用字符數(shù)組保存字符串char[]value但是沒有final關(guān)鍵字修飾,所以這兩個可變,需要的朋友可以參考下2024-01-01