身為JAVA工作者必須了解的實(shí)戰(zhàn)知識(shí)(十五)

Java內(nèi)存模型是保障多線程安全的根基,這里僅僅是認(rèn)識(shí)型的理解總結(jié)并未深入研究。

一、什么是內(nèi)存模型,為什么需要它

Java內(nèi)存模型(Java Memory Model)并發(fā)相關(guān)的安全發(fā)布,同步策略的規(guī)范、一致性等都來(lái)自于JMM。

1 平臺(tái)的內(nèi)存模型

在架構(gòu)定義的內(nèi)存模型中將告訴應(yīng)用程序可以從內(nèi)存系統(tǒng)中獲得怎樣的保證,此外還定義了一些特殊的指令(稱為內(nèi)存柵欄或柵欄),當(dāng)需要共享數(shù)據(jù)時(shí),這些指令就能實(shí)現(xiàn)額外的存儲(chǔ)協(xié)調(diào)保證。

JVM通過(guò)在適當(dāng)?shù)奈恢蒙喜迦雰?nèi)存柵欄來(lái)屏蔽在JVM與底層平臺(tái)內(nèi)存模型之間的差異。

2 重排序

多個(gè)線程同時(shí)操作同一個(gè)變量時(shí),讀與寫必須保證原子性,否則會(huì)出現(xiàn)讀取的變量值并不是最新修改的等重排序問(wèn)題。

深入理解Java內(nèi)存模型(二)——重排序

3 Java內(nèi)存模型簡(jiǎn)介

Happens-Before的規(guī)則包括:

程序順序規(guī)則。如果程序中操作A在操作B之前,那么在線程中A操作將在B操作之前執(zhí)行。

監(jiān)視器鎖規(guī)則。在監(jiān)視器鎖上的解鎖操作必須在同一個(gè)監(jiān)視器上的加鎖操作之前執(zhí)行。

Volative變量規(guī)則。對(duì)Volative變量的寫入操作必須在對(duì)該變量的讀操作之前執(zhí)行。

線程啟動(dòng)規(guī)則。在線程上對(duì)Thread.Start的調(diào)用必須在線程中執(zhí)行任何操作之前執(zhí)行。

線程結(jié)束規(guī)則。在線程中的任何操作都必須在其他線程檢測(cè)到該線程已結(jié)束之前執(zhí)行,或者從Thread.join中成功返回,或者調(diào)用Threas.isAlive時(shí)返回false。

中斷規(guī)則。當(dāng)一個(gè)線程在另一個(gè)線程上調(diào)用interrupt時(shí),必須在被中斷線程檢測(cè)到interrupt調(diào)用之前執(zhí)行(通過(guò)拋出InterruptedException,或者調(diào)用isInterrupted和interrupted)。

終結(jié)器規(guī)則。對(duì)象的構(gòu)造函數(shù)必須在啟動(dòng)該對(duì)象的終結(jié)器之前執(zhí)行完成。

傳遞性。如果操作A在操作B之前執(zhí)行,并且操作B在操作C之前執(zhí)行,則操作A必須在操作C之前執(zhí)行。

深入理解Java內(nèi)存模型(一)——基礎(chǔ)

4 借助同步

在類庫(kù)中提供的其他Happens-Before排序包括:

將一個(gè)元素放入一個(gè)線程安全容器的操作將在另一個(gè)線程從該容器中獲得這個(gè)元素的操作之前執(zhí)行。

在CountDownLatch上的倒數(shù)操作將在線程從閉鎖上的await方法中返回之前執(zhí)行。

釋放Semaphore許可的操作將在從該Semaphore上獲得一個(gè)許可之前執(zhí)行。

Future表示的任務(wù)的所有操作將在Future.get中返回之前執(zhí)行。

向Executor提交一個(gè)Runnable或Callable的操作將在任務(wù)開(kāi)始執(zhí)行之前執(zhí)行。

一個(gè)線程到達(dá)CyclicBarrier或Exchanger的操作將在其他到達(dá)該柵欄或交換點(diǎn)的線程被釋放之前執(zhí)行。如果CyclicBarrier使用一個(gè)柵欄操作,那么到達(dá)柵欄的操作將在柵欄操作之前執(zhí)行,而柵欄操作又會(huì)在線程從柵欄中釋放之前執(zhí)行。

二、發(fā)布

1 不安全的發(fā)布

除了不可變對(duì)象以外,使用被另一個(gè)線程初始化的對(duì)象通常都是不安全的,除非對(duì)象的發(fā)布操作是在使用該對(duì)象的線程開(kāi)始使用之前執(zhí)行。

2 安全的發(fā)布

3 安全初始化模式

4 雙重檢查加鎖

三、初始化過(guò)程中的安全性

好了同學(xué)們,我能介紹的也都全部介紹完給你們了,如果下獲得更多JAVA教學(xué)資源,可以選擇來(lái)我們這里共同交流,群:240448376,很多大神在這里切磋學(xué)習(xí),不懂可以直接問(wèn),晚上還有大牛免費(fèi)直播教學(xué)。

注:加群要求

1、具有一定工作經(jīng)驗(yàn)的,面對(duì)目前流行的技術(shù)不知從何下手,需要突破技術(shù)瓶頸的可以加,有些應(yīng)屆生和實(shí)習(xí)生也可以加。

2、在公司待久了,過(guò)得很安逸,但跳槽時(shí)面試碰壁。需要在短時(shí)間內(nèi)進(jìn)修、跳槽拿高薪的可以加。

3、如果沒(méi)有工作經(jīng)驗(yàn),但基礎(chǔ)非常扎實(shí),對(duì)java工作機(jī)制,常用設(shè)計(jì)思想,常用java開(kāi)發(fā)框架掌握熟練的,可以加。

4、覺(jué)得自己很牛B,一般需求都能搞定。但是所學(xué)的知識(shí)點(diǎn)沒(méi)有系統(tǒng)化,很難在技術(shù)領(lǐng)域繼續(xù)突破的可以加。

5.阿里Java高級(jí)大牛直播講解知識(shí)點(diǎn),分享知識(shí),多年工作經(jīng)驗(yàn)的梳理和總結(jié),帶著大家全面、科學(xué)地建立自己的技術(shù)體系和技術(shù)認(rèn)知!

PS:現(xiàn)在主要講解的內(nèi)容是(反射原理、枚舉原理與應(yīng)用、注解原理、常用設(shè)計(jì)模式、正規(guī)表達(dá)式高級(jí)應(yīng)用、JAVA操作Office原理詳解、JAVA圖像處理技術(shù),等多個(gè)知識(shí)點(diǎn)的詳解和實(shí)戰(zhàn))

6.小號(hào)或者小白之類加群一律不給過(guò),謝謝。

最后,每一位讀到這里的網(wǎng)友,感謝你們能耐心地看完。覺(jué)得對(duì)你有幫助可以給個(gè)喜歡!希望在成為一名更優(yōu)秀的Java程序員的道路上,我們可以一起學(xué)習(xí)、一起進(jìn)步

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容