最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java并發(fā)底層實現(xiàn)原理學(xué)習(xí)心得

 更新時間:2018年01月07日 08:57:50   投稿:laozhang  
本片文章是學(xué)習(xí)Java并發(fā)底層實現(xiàn)原理的一篇知識心得,對大家學(xué)習(xí)這個方便的知識很有幫助,一起參考下。

我們知道java實現(xiàn)的并發(fā)操作最后肯定是由我們的CPU完成的,中間經(jīng)歷了將java源碼編譯成.class文件,然后進(jìn)行加載,然后虛擬機執(zhí)行引擎進(jìn)行執(zhí)行,解釋為匯編語言,然后轉(zhuǎn)為操作系統(tǒng)指令,然后轉(zhuǎn)為1,0,最后CPU進(jìn)行識別執(zhí)行。

提到j(luò)ava的并發(fā),我們不由的就會想到j(luò)ava中常見的鍵字:volatile和synchronized,我們接下來就會從這兩個關(guān)機字展開分析:

volatile的底層實現(xiàn)原理

synchronized的實現(xiàn)原理和應(yīng)用

volatile

說到volatile,在java的面試中面試官可是最喜歡問的問題了??吹剿覀兪紫认氲降谋闶潜3志€程間的可見性,是一個輕量級的synchronized,在一些情況下它可以代替synchronized。

volatile的作用:

一個被volatie修飾的變量,java內(nèi)存模型會保證所有的線程看見的變量值是一致的。

volatile的工作原理:

我們可以定義一個volatile變量,并對他進(jìn)行賦值,并通過工具來獲取jit編譯器生成的匯編指令,我們會發(fā)現(xiàn)在對volatile變量進(jìn)行寫操作時,會多出一條指令:以lock為前綴的指令:

lock為前綴的指令在多核處理器下回引發(fā)兩件事情:

①將當(dāng)前處理器緩存行的數(shù)據(jù)回寫到內(nèi)存中。

②這個回寫內(nèi)存的操作會使得在其他cpu里緩存了改內(nèi)存地址的數(shù)據(jù)無效。

當(dāng)我們知道了以上兩點,我們就不難理解volatie變量的機制了。

在多處理器下,為了保證各個處理器的緩存是一致的,會實現(xiàn)緩存一致性協(xié)議,每個處理器通過嗅探在總線上的傳播的數(shù)據(jù)來檢查自己緩存的值是不是過期了。

synchronized

想到多線程的并發(fā),其實我第一個想到的便是這個synchronized,翻譯過來為同步,我們都知道它是一個重量級鎖,當(dāng)對一個方法或者代碼塊使用它時,當(dāng)一個線程獲得了這個鎖,那么其它的線程就會陷入掛起狀態(tài),在java中也就表現(xiàn)為sleep狀態(tài),我們都知道線程的掛起和運行時要轉(zhuǎn)入操作系統(tǒng)的內(nèi)核態(tài)的(與內(nèi)核態(tài)對應(yīng)的便是用戶態(tài)),這樣特別浪費cpu資源,所以這個重量級鎖是名副其實的!

但是,java SE 1.6過后java的維護(hù)團(tuán)隊對它進(jìn)行了一系列的優(yōu)化(這些優(yōu)化后面一一講述),他也就沒那么“重”了,以前還有優(yōu)勢的可重入鎖也變得沒那么有優(yōu)勢了(ReentrantLock)。

一下我們就下列幾個方面講述synchronized:

利用synchronized實現(xiàn)同步的基礎(chǔ)

synchronized是如何實現(xiàn)鎖的

偏向鎖,輕量級鎖(自旋鎖),重量級鎖

鎖的升級

java如何實現(xiàn)原子操作

①利用synchronized實現(xiàn)同步的基礎(chǔ):

我們在開發(fā)中或者java的源碼中都能看見synchronized的身影,例如HashTable,StringBuilder等地方,常見有兩種方式:

Ⅰ丶同步方法

同步方法只需要在方法前加上synchronized便可,當(dāng)一個線程執(zhí)行它的時候其他線程便會陷入等待,直到它釋放鎖。對方法使用又可以分為兩種:對普通同步方法和對靜態(tài)方法,它們之間的差別是加鎖的對象不同,普通方法加鎖的位置是當(dāng)前的對象,而靜態(tài)方法加鎖的位置是當(dāng)前類的Class對象。

Ⅱ丶同步方法塊

同步方法塊加鎖的是Synchronized后括號里配置的對象,這個對象可以是一個值以及任何一個變量或者對象。

②synchronized是如何實現(xiàn)鎖的:

在jvm的規(guī)范中可以看到synchronized在jvm中的實現(xiàn)原理,jvm基于進(jìn)入和退出Monitor對象來實現(xiàn)同步方法和代碼塊的同步,代碼塊是使用monitorenter和monitorexit指令來實現(xiàn)的,而同步方法jvm規(guī)范里沒有具體給出,但是我相信具體的原理應(yīng)該相差不大,無非是將java源碼編譯為class文件,在class字節(jié)碼文件中對使用synchronized的方法進(jìn)行一個標(biāo)記,在字節(jié)碼引擎執(zhí)行這個方法的時候會對這個方法進(jìn)行同步處理。

③偏向鎖,輕量級鎖(自旋鎖),重量級鎖:

在講鎖之前我們需要知道java對象頭,java的對象頭:
synchronized使用的鎖是存儲在java對象頭里的,java對象頭里面有32bit/64bit(視操作系統(tǒng)的位數(shù)而定)長度的MarkWord 里面存儲了對象的hashCode和鎖的信息等,在MarkWord中有2bit的空間來表示鎖的狀態(tài)00,01,10,11,分別表示輕量級鎖,偏向鎖,重量級鎖,GC標(biāo)記。

偏向鎖:偏向鎖也就人稱它為偏心鎖,從名字我們就可以看出來,它是一個偏向某一個線程的鎖。

在實際的開發(fā)中,我們發(fā)現(xiàn)多線程并發(fā),大多數(shù)執(zhí)行同步方法的都是同一個線程,出現(xiàn)多個線程爭搶一個方法的概率比較低,所以重復(fù)的獲取鎖和釋放鎖就會產(chǎn)生大量的資源浪費,所以為了讓線程獲得鎖的代價更低引入了偏向鎖,當(dāng)一個線程訪問一個同步塊并獲得鎖時,會在對象頭和線程的棧幀中的鎖記錄中存儲偏向鎖的線程ID,以后該線程進(jìn)入和退出同步塊時不需要進(jìn)行CAS操作來進(jìn)行加鎖和解鎖,只需要簡單的查看對象頭的MarkWord里是否還存有指向當(dāng)前的偏向鎖(在MarkWord中每個對象還有一個偏向鎖標(biāo)志位用來表示當(dāng)前對象是否支持偏向鎖,我們可以使用jvm參數(shù)來設(shè)定偏向鎖)。

關(guān)于偏向鎖的釋放,偏向鎖使用了等到存在競爭時才釋放鎖的機制,所以當(dāng)有其他線程嘗試競爭偏向鎖的時候持有偏向鎖的線程才會釋放鎖。

注意:在java6,7中偏向鎖是默認(rèn)啟動的

輕量級鎖:

輕量級鎖就是在執(zhí)行同步塊之前,jvm會在當(dāng)前線程的棧幀中創(chuàng)建用于存儲鎖記錄的的空間,并將對象頭中的MarkWord復(fù)制到里面,然后線程將嘗試將對象頭內(nèi)的MarkWord替換為指向鎖記錄的指針,如果成功,當(dāng)前線程獲得鎖,如果失敗,表示其他線程競爭鎖,當(dāng)前線程便自旋來獲得鎖。

④鎖的升級:

當(dāng)前線程如果無法試用上面的方法獲得鎖,那么表示當(dāng)前的鎖存在競爭,鎖就會升級為重量級鎖。

輕量級鎖和偏向鎖的區(qū)別:

輕量級鎖是在無競爭的情況下使用CAS操作去消除同步使用的互斥量,而偏向鎖就是在無競爭的情況下把整個同步都去除,連CAS操作都不做!

⑤ java如何實現(xiàn)原子操作:

在了解java是如何實現(xiàn)原子操作之前,我們要知道處理器是如何實現(xiàn)原子操作的:

處理器一般分為兩種方法執(zhí)行原子操作:緩存加鎖和總線加鎖,其中緩存加鎖比較優(yōu)秀而總線加鎖則比較消耗資源。(關(guān)于兩種加鎖的方式我們這里不做過多解釋,具體在操作系統(tǒng)中有詳細(xì)的講解)

java使用(大多數(shù)情況下)循環(huán)CAS實現(xiàn)原子操作,但是使用CAS實現(xiàn)原子操作也會出現(xiàn)下面的一些經(jīng)典的問題:

一)ABA問題

jdk中提供AtomicStampedReference類來解決(提供檢查預(yù)期引用和預(yù)期標(biāo)志)

二)循環(huán)時間長開銷大

無法解決,這個是循環(huán)的通病

三)只能保證一個共享變量的原子操作

jdk中提供一個AtomicReference來解決,將多個共享變量放置在一個類中進(jìn)行CAS操作。

相關(guān)文章

  • Mybatis執(zhí)行update失敗的解決

    Mybatis執(zhí)行update失敗的解決

    這篇文章主要介紹了Mybatis執(zhí)行update失敗的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java獲取配置文件的值過程解析

    Java獲取配置文件的值過程解析

    這篇文章主要介紹了java獲取配置文件的值過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01
  • Spring Boot 3 整合 Spring Cloud Gateway實踐過程

    Spring Boot 3 整合 Spring Cloud 

    本文介紹了如何使用SpringCloudAlibaba2023.0.0.0版本構(gòu)建一個微服務(wù)網(wǎng)關(guān),包括統(tǒng)一路由、限流防刷和登錄鑒權(quán)等功能,并通過一個項目實例進(jìn)行詳細(xì)說明,感興趣的朋友一起看看吧
    2025-02-02
  • SpringBoot參數(shù)校驗的方法總結(jié)

    SpringBoot參數(shù)校驗的方法總結(jié)

    今天帶大家學(xué)習(xí)SpringBoot參數(shù)校驗的方法,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-05-05
  • SpringBoot?+DynamicDataSource切換多數(shù)據(jù)源的全過程

    SpringBoot?+DynamicDataSource切換多數(shù)據(jù)源的全過程

    這篇文章主要介紹了SpringBoot?+DynamicDataSource切換多數(shù)據(jù)源的全過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Java中WeakHashMap的使用詳解

    Java中WeakHashMap的使用詳解

    這篇文章主要介紹了Java中WeakHashMap的使用詳解,WeakHashMap是一種弱引用的Map,底層數(shù)據(jù)結(jié)構(gòu)為數(shù)組鏈表,與HashMap相比,WeakHashMap的區(qū)別在于它的key存儲為弱引用,在垃圾回收時,如果key沒有被強引用所引用,那么key會被回收掉,需要的朋友可以參考下
    2023-09-09
  • SpringBoot快速整合SpringSecurity的詳細(xì)步驟(新手都會!)

    SpringBoot快速整合SpringSecurity的詳細(xì)步驟(新手都會!)

    日 Spring Security 是針對Spring項目的安全框架,也是Spring Boot底層安全模塊默認(rèn)的技術(shù)選型,他可以實現(xiàn)強大的Web安全控制,下面這篇文章主要給大家介紹了關(guān)于SpringBoot快速整合SpringSecurity的詳細(xì)步驟,需要的朋友可以參考下
    2023-03-03
  • Java集合Iterator迭代的實現(xiàn)方法

    Java集合Iterator迭代的實現(xiàn)方法

    這篇文章主要介紹了Java集合Iterator迭代接口的實現(xiàn)方法,非常不錯,具有參考借鑒家,對Java 結(jié)合iterator知識感興趣的朋友一起看看吧
    2016-08-08
  • JavaScript中的closest方法示例詳解

    JavaScript中的closest方法示例詳解

    這篇文章主要介紹了JavaScript中closest方法的相關(guān)資料,closest()是JavaScript中的一個非常實用的?DOM?方法,用于查找與當(dāng)前元素匹配的最近的祖先元素,它支持?CSS?選擇器,可以應(yīng)用于事件委托、動態(tài)內(nèi)容處理等場景,需要的朋友可以參考下
    2025-02-02
  • 利用java實現(xiàn)二維碼和背景圖的合并

    利用java實現(xiàn)二維碼和背景圖的合并

    本文介紹如何使用java代碼將自動生成的二維碼放入背景模板中,對于java學(xué)習(xí)者或許有幫助,一起來看看。
    2016-07-07

最新評論

玉树县| 镶黄旗| 铁岭县| 南汇区| 民权县| 民乐县| 舟山市| 丁青县| 东辽县| 台东市| 连云港市| 深圳市| 林周县| 视频| 奉贤区| 南皮县| 天镇县| 永胜县| 扶绥县| 吉林市| 宁陕县| 贺州市| 安化县| 邢台市| 无极县| 保康县| 新田县| 泾源县| 阿合奇县| 瑞丽市| 天峨县| 大石桥市| 弥勒县| 张家川| 胶南市| 临漳县| 珲春市| 西林县| 定襄县| 建平县| 繁昌县|