溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java并發(fā)編程怎么理解

發(fā)布時(shí)間:2021-11-30 15:01:24 來(lái)源:億速云 閱讀:100 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要介紹“Java并發(fā)編程怎么理解”,在日常操作中,相信很多人在Java并發(fā)編程怎么理解問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Java并發(fā)編程怎么理解”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

鎖是用來(lái)控制多個(gè)線程訪問(wèn)共享資源的方式,一般來(lái)說(shuō),一個(gè)鎖能夠防止多個(gè)線程同時(shí)訪問(wèn)共享資源(但是有些鎖可以允許多個(gè)線程并發(fā)的訪問(wèn)共享資源,比如讀寫(xiě)鎖)。

happens-before簡(jiǎn)介

從JDK 5開(kāi)始,Java使用新的JSR-133內(nèi)存模型(除非特別說(shuō)明,本文針對(duì)的都是JSR-133內(nèi)存模型)。JSR-133使用happens-before的概念來(lái)闡述操作之間的內(nèi)存可見(jiàn)性。在JMM中,如果一個(gè)操作執(zhí)行的結(jié)果需要對(duì)另一個(gè)操作可見(jiàn),那么這兩個(gè)操作之間必須要存在happens-before關(guān)系。這里提到的兩個(gè)操作既可以是在一個(gè)線程之內(nèi),也可以是在不同線程之間

Java并發(fā)編程怎么理解

·程序順序規(guī)則:一個(gè)線程中的每個(gè)操作,happens-before于該線程中的任意后續(xù)操作。

·監(jiān)視器鎖規(guī)則:對(duì)一個(gè)鎖的解鎖,happens-before于隨后對(duì)這個(gè)鎖的加鎖。

·volatile變量規(guī)則:對(duì)一個(gè)volatile域的寫(xiě),happens-before于任意后續(xù)對(duì)這個(gè)volatile域的讀。

·傳遞性:如果A happens-before B,且B happens-before C,那么A happens-before C。

注意 兩個(gè)操作之間具有happens-before關(guān)系,并不意味著前一個(gè)操作必須要在后一個(gè)操作之前執(zhí)行!happens-before僅僅要求前一個(gè)操作(執(zhí)行的結(jié)果)對(duì)后一個(gè)操作可見(jiàn),且前一個(gè)操作按順序排在第二個(gè)操作之前(the first is visible to and ordered before the second)。

3.2 重排序

重排序是指編譯器和處理器為了優(yōu)化程序性能而對(duì)指令序列進(jìn)行重新排序的一種手段。

3.2.1 數(shù)據(jù)依賴性

如果兩個(gè)操作訪問(wèn)同一個(gè)變量,且這兩個(gè)操作中有一個(gè)為寫(xiě)操作,此時(shí)這兩個(gè)操作之間

就存在數(shù)據(jù)依賴性

as-if-serial語(yǔ)義

as-if-serial語(yǔ)義的意思是:不管怎么重排序(編譯器和處理器為了提高并行度),(單線程)

程序的執(zhí)行結(jié)果不能被改變

順序一致性內(nèi)存模型

Java并發(fā)編程怎么理解

其實(shí)就是線程所見(jiàn)都是單一的執(zhí)行順序,i++就是編譯指令為4步的非原子操作,執(zhí)行順序可變

數(shù)據(jù)通過(guò)總線在處理器和內(nèi)存之間傳遞。每次處理器和內(nèi)存之間的數(shù)據(jù)傳遞都是通過(guò)一系列步驟來(lái)完成的,這一系列步驟稱之為總線事務(wù)(Bus Transaction)。

Java并發(fā)編程怎么理解

疑問(wèn)?這個(gè)總線與CPU的總線是一個(gè)概念嗎?宏觀的作用上差不多

Java并發(fā)編程怎么理解

如圖  來(lái)自B站柏義

volatile禁止指令重排是因?yàn)長(zhǎng)oadStore導(dǎo)致的不能重排

Java并發(fā)編程怎么理解

對(duì)公平鎖和非公平鎖的內(nèi)存語(yǔ)義做個(gè)總結(jié)。

·公平鎖和非公平鎖釋放時(shí),最后都要寫(xiě)一個(gè)volatile變量state。

·公平鎖獲取時(shí),首先會(huì)去讀volatile變量。

·非公平鎖獲取時(shí),首先會(huì)用CAS更新volatile變量,這個(gè)操作同時(shí)具有volatile讀和volatile寫(xiě)的內(nèi)存語(yǔ)義。

線程的優(yōu)先級(jí)

Deamon線程(美[?di?m?n])

Daemon線程是一種支持型線程,因?yàn)樗饕挥米鞒绦蛑泻笈_(tái)調(diào)度以及支持性工作。這意味著,當(dāng)一個(gè)Java虛擬機(jī)中不存在非Daemon線程的時(shí)候,Java虛擬機(jī)將會(huì)退出??梢酝ㄟ^(guò)調(diào)用Thread.setDaemon(true)將線程設(shè)置為Daemon線程。

1.當(dāng)主線程退出時(shí),守候子線程會(huì)執(zhí)行完畢嗎?

不一定執(zhí)行

ti.setDaemon(true);

守候線程執(zhí)行依賴于執(zhí)行時(shí)間

理解中斷

Thread.interrupt()   設(shè)置狀態(tài)

isInterrupted()    判斷 返回Boolean

interrupted 即判斷又清除

中斷可以理解為線程的一個(gè)標(biāo)識(shí)位屬性,它表示一個(gè)運(yùn)行中的線程是否被其他線程進(jìn)行了中斷操作。中斷好比其他線程對(duì)該線程打了個(gè)招呼,其他線程通過(guò)調(diào)用該線程的interrupt()方法對(duì)其進(jìn)行中斷操作。

線程通過(guò)檢查自身是否被中斷來(lái)進(jìn)行響應(yīng),線程通過(guò)方法isInterrupted()來(lái)進(jìn)行判斷是否被中斷,也可以調(diào)用靜態(tài)方法Thread.interrupted()對(duì)當(dāng)前線程的中斷標(biāo)識(shí)位進(jìn)行復(fù)位.

線程池技術(shù)及其實(shí)例

ThreadPoolExecutor源碼

// 執(zhí)行一個(gè)Job,這個(gè)Job需要實(shí)現(xiàn)Runnablepublic void execute(Runnable command) {} // 關(guān)閉線程池public void shutdown() {}處理正在等待的任務(wù),并返回任務(wù)列表public List<Runnable> shutdownNow() {}//1)菜用循環(huán)CAS操作來(lái)將線程數(shù)加1;2)新建一個(gè)線程并啟用。private boolean addWorker(Runnable firstTask, boolean core) {}//獲取線程池?cái)?shù)量public int getPoolSize() {}

Java并發(fā)編程怎么理解

到此,關(guān)于“Java并發(fā)編程怎么理解”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI