并发编程的艺术:第二章
生活随笔
收集整理的這篇文章主要介紹了
并发编程的艺术:第二章
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
第二章:Java并發(fā)機(jī)制的底層實(shí)現(xiàn)原理
- Java代碼在編譯之后會(huì)生成字節(jié)碼文件,也就是.class文件。class文件經(jīng)過類加載器的加載到JVM中,JVM解釋字節(jié)碼文件,最終轉(zhuǎn)化為匯編指令在CPU上執(zhí)行。Java中所使用的并發(fā)機(jī)制依賴于JVM的實(shí)現(xiàn)和CPU的指令
2:volatile
- 保證了所有變量的內(nèi)存可見性
- 修改完之后,就會(huì)立即寫入內(nèi)存,并且告訴各個(gè)CPU中的緩存失效
- 匯編指令:LOCK
- 將當(dāng)前的緩存行寫入內(nèi)存中
- 鎖總線,或者是鎖緩存
- 告訴其他的COU緩存的數(shù)據(jù)無效
3:synchronized
1:鎖的對(duì)象
- 普通的同步方法,鎖的是該實(shí)例
- static靜態(tài)方法,鎖的是class對(duì)象
- 同步方法塊,鎖的是括號(hào)中的對(duì)象
2:原理
- JVM基于進(jìn)入和退出monitor對(duì)象來實(shí)現(xiàn)方法同步和代碼塊進(jìn)行同步。代碼塊的同步時(shí)使用monitorenter和monitorexit指令進(jìn)行實(shí)現(xiàn)的,但是方法的同步不是。
- monitorenter指令是在編譯后插入到同步代碼塊開始的位置,monitorexit是在方法結(jié)尾的地方,當(dāng)有一個(gè)monitor被持有的時(shí)候,他就會(huì)處于鎖定的狀態(tài)。線程執(zhí)行到monitor的時(shí)候,就會(huì)嘗試獲得對(duì)象所持有的鎖。
3:Java對(duì)象頭
- mark word 對(duì)象頭
- hashcod GC年齡 鎖(一位是偏向鎖,兩位鎖的標(biāo)志)
- 偏向鎖:線程ID + Epoch + GC年齡 + 1 + 01
- Epoch表示重偏向了幾次,記錄偏向鎖被撤銷的次數(shù),當(dāng)次數(shù)達(dá)到閾值的時(shí)候,就不會(huì)分配偏向鎖。
- 輕量級(jí)鎖:指向棧中鎖記錄的指針 + 00
- 重量級(jí)鎖:指向互斥量的指針 + 10
- GC標(biāo)記:空 + 11
- 存儲(chǔ)該對(duì)象類型數(shù)據(jù)的指針
4:鎖的升級(jí)
- 偏向鎖
- 對(duì)象頭和鎖記錄中存放偏向的線程ID
- 輕量級(jí)鎖
- JVM會(huì)在當(dāng)前的線程棧中創(chuàng)建用于存儲(chǔ)鎖記錄的空間,并將對(duì)象頭中的mark word復(fù)制到鎖記錄中,即displaced mark word。
- 然后線程進(jìn)行CAS將對(duì)象頭中的mark word替換為指向鎖記錄的指針,如果成功,當(dāng)前的線程獲得鎖。
- 重量級(jí)鎖
- 線程堵塞,響應(yīng)時(shí)間緩慢
5:實(shí)現(xiàn)原子操作
-
總線加鎖
- 處理器提供一個(gè)LOCK信號(hào),當(dāng)一個(gè)處理器在總線上輸出此信號(hào)的時(shí)候,其他處理器的請(qǐng)求將會(huì)被阻塞,該處理器可以獨(dú)占共享內(nèi)存
-
緩存鎖
- 寫回的時(shí)候,不再發(fā)送LOCK信號(hào),而是修改內(nèi)部的內(nèi)存地址,并通過緩存一致性的機(jī)制來保證操作的原子性。阻止兩個(gè)以上的CPU同時(shí)修改自己的緩存信息
- 數(shù)據(jù)不能被緩存在處理器內(nèi)部的時(shí)候,或者是跨多個(gè)緩存行的時(shí)候,就不能使用緩存鎖
- 有一些處理器不支持緩存鎖定
- 寫回的時(shí)候,不再發(fā)送LOCK信號(hào),而是修改內(nèi)部的內(nèi)存地址,并通過緩存一致性的機(jī)制來保證操作的原子性。阻止兩個(gè)以上的CPU同時(shí)修改自己的緩存信息
6:Java實(shí)現(xiàn)原子操作
- CAS
- CAMXCHG
- 三大問題
- ABA
- 循環(huán)性能問題
- 只能改變單個(gè)變量
- 鎖機(jī)制
總結(jié)
以上是生活随笔為你收集整理的并发编程的艺术:第二章的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 服务端的第六周第二次的课程
- 下一篇: HTTP 和 HTTPS