Java高併發基礎篇 併發與執行緒(一)

2021-08-28 22:25:43 字數 1497 閱讀 3326

執行緒是輕量級程序,是程式執行的最小單位

在介紹執行緒之前,我們必須要知道程序的概念。***程序(process)*是計算機中的程式關於某資料集合上的一次執行活動,是系統進行資源分配和排程的基本單位,是作業系統結構的基礎。程序是程式的基本執行體,執行緒的容器。程式是指令、資料及其組織形式的描述,程序是程式的實體。

##程序和執行緒是什麼關係?

程序是執行緒的容器,乙個程序可以容納若干個執行緒。

我們可以把程序比喻成乙個工廠的車間,執行緒就是車間裡每個流水線上的工人,車間裡的裝置就是程序內的資源,工人在各自的流水線上使用裝置生產,就像執行緒各自占用程序裡的資源執行任務一樣。

執行緒的所有狀態在thread中的state列舉中定義:

public enum state
注意:從new狀態觸發後,執行緒不能斜體樣式再回到new狀態,同理,處於terminated的執行緒也不能再回到runnable狀態。

臨界區用來表示一種公共資源或者說是共享資料,可以被多個執行緒使用。但一次只能由乙個執行緒來使用它,其他執行緒想要使用,必須等待。

在並行程式中,臨界區資源是保護的物件。

阻塞和非阻塞通常用來形容多執行緒間的相互影響。當乙個執行緒占用了臨界區資源,其他需要這個資源的執行緒必須在臨界區等待。等待會導致執行緒掛起,這種情況就是阻塞。

非阻塞,強調沒有乙個執行緒可以妨礙其他執行緒的執行。

死鎖、飢餓和活鎖都屬於多執行緒的活躍性問題,如果出現上述幾種情況,那麼相關執行緒可能就不再活躍,也就很難再繼續執行下去。

(1) 互斥條件:乙個資源每次只能被乙個程序使用。

(2) 請求與保持條件:乙個程序因請求資源而阻塞時,對已獲得的資源保持不放。

(3) 不剝奪條件:程序已獲得的資源,在末使用完之前,不能強行剝奪。

(4) 迴圈等待條件:若干執行緒之間形成一種頭尾相接的迴圈等待資源關係。

如果執行緒之間是有優先順序的,那麼執行緒排程的時候總是會傾向於滿足高優先順序的執行緒。也就是說,對於同一資源的分配是不公平的。這種非公平的鎖來說,系統允許優先順序高的執行緒插隊。就可能會導致低優先順序的執行緒產生飢餓。

##無障礙(obstruction-free)

無障礙是一種最弱的非阻塞排程。無障礙執行不會因為臨界區的問題導致一方被掛起,任何執行緒都可以進入臨界區,修改共享資料。對於無障礙的執行緒來說,一旦檢測到多方同時修改共享資料的情況,它會立即對自己所做的修改進行回滾,確保資料安全。

無鎖的並行都是無障礙的,所有執行緒都能嘗試對臨界區進行訪問。

##無等待(wait-free)

無等待是一種在無鎖的基礎上更進一步進行擴充套件,它要求所有執行緒都必須在有限步內完成,這樣就不會引起飢餓問題。

java 併發 高併發概述

為什麼需要並行 有關並行的重要概念 有關並行效能的2個重要定律 多執行緒基礎 執行緒的基本操作 守護執行緒 優先順序 中斷處理 基本的執行緒同步操作 各種同步控制工具的使用 併發容器及典型原始碼分析 同步工具 併發容器使用小案例 第5課 jdk並發包 執行緒池的基本使用 擴充套件和增強執行緒池 執行...

多執行緒與高併發

blocked 鎖池 timed waiting 定時等待 waiting 等待 terminated 禁止指令重排序 記憶體屏障 在單例雙重檢查中,不加會出現使用半初始化的值,也就是還未附初始值,指令重排導致的 類載入與指令重排的知識 public class spinlock while fla...

多執行緒與高併發1 基礎定義

程序是作業系統能夠分配的最小單位 執行緒是作業系統能夠排程的最小單位 乙個程式的不同執行路徑 1.thread 2.runnable 3.executors sleep執行緒進行睡眠,讓出cpu給其他執行緒繼續執行。到規定的時間喚醒 yield將當前執行緒回到等待佇列中,返回到就緒狀態,讓出cpu ...