Java併發編程學習前期知識上篇

Java併發編程學習前期知識上篇

我們先來看看幾個大廠真實的面試題:

Java併發編程學習前期知識上篇

Java併發編程學習前期知識上篇

Java併發編程學習前期知識上篇

​從上面幾個真實的面試問題來看,我們可以看到大廠的面試都會問到併發相關的問題。所以

Java併發,這個無論是面試還是在工作中,併發都是會遇到的。Java併發包JUC(java.util.concurrent)有了解過哪些?併發包實現最重要的是什麼?其原理是什麼知道嗎?何為JMM的可見性?volatiile關鍵字是怎麼實現變量可見性的?如果想要學好併發,弄懂理解透徹的話,凱哥覺得以下計算機的知識還是要了解了解。本次《Java併發編程-前期準備知識》凱哥準備用兩篇來介紹,主要包括以下內容:簡單介紹內存之間可見性是什麼?volatile關鍵字在Java語言規範中是怎麼定義的?知道JVM但是你知道JMM是什麼嗎?計算機中CPU是怎麼處理數據的?通過CPU處理數據來深刻理解線程之間可見性。還有就是volatile是怎麼保證可見性的呢?其實現的兩條原理是什麼?

Java併發包(JUC)下的類或者可以說Java併發機制的實現有一個關鍵字很重要:volatile。這個關鍵字,修飾的變量能夠實現“可見性”。那麼實現的原理是什麼?

可見性是什麼?

可見性:

其他叫法:變量的可見性;線程之間可見性;內存可見性。

是指當一個線程修改一個共享變量的似乎和,另外一個線程能夠讀到這個修改後的值。

Volatile關鍵字的定義

我們來看看Oracle對Java8語言規範中對Volatile的定義。訪問如下:

Java併發編程學習前期知識上篇

Java併發編程學習前期知識上篇

在第8章節的8.3中國8.3.1.4對volatile字段描述:

Java併發編程學習前期知識上篇

Java編程語言允許線程訪問共享變量。作為規則,為了確保共享變量被一致並可靠的更新,線程應該確保獨佔使用這種變量,其管用的方式是通過獲取鎖來實現,及強制線程互斥地使用這些變量。

Java語言還提供了第二種機制,即volatile關鍵字。當變量被volatile修飾後,Java內存模型會確保所有線程看到的都是該變量的一致值。

中文版翻譯如下:

Java併發編程學習前期知識上篇

PS:在看書的時候書中這麼描述的:Java語言規範第三版中對volatile的定義如下:xxxx.

為了找到這個說明凱哥可是各種查找,結果沒找到。於是去看官方文檔的時候,終於看到了。《Java語言規範 基於 Java SE 8 中文》凱哥(kaigejava)也已經準備好了。如下圖:

Java併發編程學習前期知識上篇

從Java語言規範描述,我們可以知道,在Java中下次訪問共享變量為了保證一致性更新有兩種方式:

方式一:通過加鎖事情具有排他性單獨獲取變量來操作

方式二:使用volatile關鍵字來修飾變量。

這裡我們先來講講volatile實現變量可見性的底層原理。

在聊聊volatile底層原理前,我們先來認識另一個知識點:JMM

JMM

我們都知道JVM 即是Java虛擬機。但是JMM你知道嗎?

JMM(Java Memory Model):即Java內存模型。

我們來看看Java語言規範中對JMM定義:

Java併發編程學習前期知識上篇

上圖什麼意思?沒搞明白。簡單的說:JMM是一種抽象的概念。描述的是一組規則或者是規範,通過這個規則定義了線程中的各個變量的訪問方式。

JMM對線程之間同步有以下幾點規定:

1:線程在釋放鎖的時候,必須先要把共享變量的值寫回到主內存中之後,才可以釋放鎖

2:線程在加鎖的時候,必須先把主內存中變量最新值讀取到自己的工作內存中之後,才可以執行加鎖操作;

3:加鎖和解鎖操作的必須是同一把鎖。

JMM的特性:

1:可見性

2:原子性

3:有序性

在講解JMM之前,我們再來簡單瞭解下CPU相關的知識。


分享到:


相關文章: