日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

编程体系结构(05):Java多线程并发

發布時間:2025/3/16 java 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 编程体系结构(05):Java多线程并发 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文源碼:GitHub·點這里 || GitEE·點這里

一、多線程導圖

二、多線程基礎

1、基礎概念

線程是操作系統能夠進行運算調度的最小單位,包含在進程之中,是進程中的實際運作單位。一條線程指的是進程中一個單一順序的控制流,一個進程中可以并發多個線程,每條線程并行執行不同的任務。

2、創建方式

繼承Thread類、實現Runnable接口、基于Callable和Future接口、Timer是后臺線程、線程池。

3、線程狀態

狀態描述:初始狀態、運行狀態、阻塞狀態、等待狀態、超時等待狀態、終止狀態。

4、執行機制

JVM中一個應用是可以有多個線程并行執行,線程被一對一映射為服務所在操作系統線程,調度在可用的CPU上執行,啟動時會創建一個操作系統線程;當該線程終止時,這個操作系統線程也會被回收。

5、內存模型

在虛擬機啟動運行時,會創建多個線程,數據區中有的模塊是線程共享的,有的是線程私有的:

線程共享:元數據區、堆Heap;

線程私有:虛擬機棧、本地方法棧、程序計數器;

單個CPU在特定時刻只能執行一個線程,所以多線程通過幾塊空間的使用,然后不斷的爭搶CPU的執行時間段。

三、常見概念

1、線程優先級

線程調度器傾向執行線程優先級高的線程,線程優先級高說明獲取CPU資源的概率高,或者獲取的執行時間分片多,被執行的概率高但不代表優先級低的一定最后執行。

2、守護線程

守護線程是支持輔助型線程,主要在程序中起到調度和支持性作用,當Jvm中非守護線程全部結束,守護線程也就會結束。

3、線程加入

線程A中,執行線程B的加入方法,那么A線程就會等待線程B執行完畢再返回繼續執行。

4、本地線程

ThreadLocal也叫做線程本地變量,為變量在每個線程中的創建副本,每個線程可以訪問自己內部的副本變量,線程之間互不相互影響。

四、線程安全

在上圖線程與內存空間的占用方式看,在線程訪問共享內存塊時,保證線程安全就很有必要。

1、同步控制

Synchronized關鍵字同步控制,可以修飾方法,修飾代碼塊,修飾靜態方法等,同步控制的資源少,可以提高多線程效率。

2、加鎖機制

Lock接口:Java并發編程中資源加鎖的根接口之一,規定了資源鎖使用的幾個基礎方法。

ReentrantLock類:實現Lock接口的可重入鎖,即線程如果獲得當前實例的鎖,并進入任務方法,在線程沒有釋放鎖的狀態下,可以再次進入任務方法,特點:互斥排它性,即同一個時刻只有一個線程進入任務。

Condition接口:描述可能會與鎖有關聯的條件變量,提供了更強大的功能,例如在線程的等待/通知機制上,Conditon可以實現多路通知和選擇性通知。

3、Volatile關鍵字

volatile修飾成員變量,不能修飾方法,即標識該線程在訪問這個變量時需要從共享內存中獲取,對該變量的修改,也需要同步刷新到共享內存中,保證了變量對所有線程的可見性。

五、線程通信

線程是個獨立的個體,但是在線程執行過程中,如果處理同一個業務邏輯,可能會產生資源爭搶,導致并發問題,甚至死鎖現象,線程之間協調工作,就需要通信機制來保障。

1、基礎方法

相關方法是Java中Object層級的基礎方法,任何對象都有該方法:notify()隨機通知一個在該對象上等待的線程,使其結束wait狀態返回;wait()線程進入waiting等待狀態,不會爭搶鎖對象,也可以設置等待時間;

2、等待/通知機制

等待/通知機制,該模式下指線程A在不滿足任務執行的情況下調用對象wait()方法進入等待狀態,線程B修改了線程A的執行條件,并調用對象notify()或者notifyAll()方法,線程A收到通知后從wait狀態返回,進而執行后續操作。兩個線程通過基于對象提供的wait()/notify()/notifyAll()等方法完成等待和通知間交互,提高程序的可伸縮性。

3、管道流通信

管道流主要用于在不同線程間直接傳送數據,一個線程發送數據到輸出管道,另一個線程從輸入管道中讀取數據,進而實現不同線程間的通信。

六、線程池

1、Executor接口

Executor系統中,將線程任務提交和任務執行進行了解耦的設計,Executor有各種功能強大的實現類,提供便捷方式來提交任務并且獲取任務執行結果,封裝了任務執行的過程,不再需要Thread().start()方式,顯式創建線程并關聯執行任務。

2、核心參數

3、相關API類

線程池任務:核心接口:Runnable、Callable接口和接口實現類;

任務的結果:接口Future和實現類FutureTask;

任務的執行:核心接口Executor和ExecutorService接口。在Executor框架中有兩個核心類實現了ExecutorService接口,ThreadPoolExecutor和ScheduledThreadPoolExecutor。

七、常用線程API

1、Fork/Join機制

Fork/Join框架用于并行執行任務,核心的思想就是將一個大任務切分成多個小任務,然后匯總每個小任務的執行結果得到這個大任務的最終結果。核心流程:切分任務,模塊任務異步執行,單任務結果合并。

2、容器類

ConcurrentHashMap:使用分段鎖機制,把容器中數據分成一段一段的方式存儲,然后給每一段數據配一把鎖,當一個線程占用鎖訪問其中一個段數據的時候,其他段的數據也能被其他線程訪問,即考慮安全性也顧及執行效率。

ConcurrentLinkedQueue:基于鏈接節點的無界線程安全隊列,按照FIFO先進先出原則對元素進行排序,隊列的頭部 是隊列中時間最長的元素,隊列的尾部是隊列中時間最短的元素,新的元素添加到隊列的尾部,獲取元素操作從隊列頭部得到。

3、原子類

JDK自帶原子操作類,處理多個線程同時操作一個變量的情況,其中包括:基本類型、數組類型、引用類型、屬性修改類型。

八、應用場景

1、定時任務

通過配置設置一些程序在指定時間點,或者周期時間內規律循環執行,這里任務的執行就是基于多線程技術。

2、異步處理

異步處理就是不按照當前同步代碼塊程序執行,異步處理與同步處理是對立的,異步的實現也需要多線程或者多進程,提高程序效率。

3、任務分解

分布式數據庫中常見操作,數據分布在不同的數據庫的副本中,在執行查詢時,每個服務都要跑查詢任務,最后在一個服務上做數據合并,或者提供一個中間引擎層,用來匯總數據,在大型的定時任務中,經常把要處理的任務按照特定策略分片,多個線程同時處理。

4、連接池技術

創建和管理一個連接的緩沖池的技術,這些連接準備好被任何需要它們的線程使用,減少連接不斷創建和釋放的問題,提高程序效率。

九、源代碼地址

GitHub·地址 https://github.com/cicadasmile GitEE·地址 https://gitee.com/cicadasmile

推薦閱讀:編程體系整理

序號項目名稱GitHub地址GitEE地址推薦指數
01Java描述設計模式,算法,數據結構GitHub·點這里GitEE·點這里☆☆☆☆☆
02Java基礎、并發、面向對象、Web開發GitHub·點這里GitEE·點這里☆☆☆☆
03SpringCloud微服務基礎組件案例詳解GitHub·點這里GitEE·點這里☆☆☆
04SpringCloud微服務架構實戰綜合案例GitHub·點這里GitEE·點這里☆☆☆☆☆
05SpringBoot框架基礎應用入門到進階GitHub·點這里GitEE·點這里☆☆☆☆
06SpringBoot框架整合開發常用中間件GitHub·點這里GitEE·點這里☆☆☆☆☆
07數據管理、分布式、架構設計基礎案例GitHub·點這里GitEE·點這里☆☆☆☆☆
08大數據系列、存儲、組件、計算等框架GitHub·點這里GitEE·點這里☆☆☆☆☆

總結

以上是生活随笔為你收集整理的编程体系结构(05):Java多线程并发的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。