欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

通過實例解析JMM和Volatile底層原理

 更新時間:2020年01月10日 15:33:58   作者:VincentYew  
這篇文章主要介紹了通過實例解析JMM和Volatile底層原理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

這篇文章主要介紹了通過實例解析JMM和Volatile底層原理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

JMM和volatile分析

1.JMM:Java Memory Model,java線程內(nèi)存模型

JMM:它是一個抽象的概念,描述的是線程和內(nèi)存間的通信,java線程內(nèi)存模型和CPU緩存模型類似,它是標準化的,用于屏蔽硬件和操作系統(tǒng)對內(nèi)存訪問的差異性。

2.JMM和8大原子操作結(jié)合

3.volatile的應用及底層原理探究

volatile : 輕量級的synchronized,在多處理器的開發(fā)中保證了共享變量的"可見性"??梢娦缘囊馑迹寒斠粋€線程修改了某個共享變量時,其他使用到該共享變量的線程能夠及時讀取到修改的值。修飾得當,比synchronized的執(zhí)行成本更低,因為它不會引起線程上下文切換和調(diào)度。

public class VolatileTest {
  private static volatile boolean flag = false;
  public static void main(String[] args) {
    update();
  }

  public static void update(){
    flag = true;
    System.out.println(flag);
  }
}
Volatile JIT編譯器編譯java代碼為匯編指令查看
1.在jdk\jre\bin\ 目錄下添加 hsdis-amd64.lib
2.在jdk1.8\jre\bin\server\目錄下添加hsdis-amd64.dll文件
3.在IDEA中設置 JVM參數(shù)
-server -Xcomp -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -XX:CompileCommand=compileonly,VolatileTest.update
4.運行Java程序即可打印出
CompilerOracle: compileonly *VolatileTest.update
Loaded disassembler from E:\EclipseDev\jdk\jdk1.8\jre\bin\server\hsdis-amd64.dll
Decoding compiled method 0x000000000f11aad0:
Code:
Argument 0 is unknown.RIP: 0xf11ac40 Code size: 0x000002a8
[Disassembling for mach='amd64']
[Entry Point]
[Verified Entry Point]
[Constants]
 # {method} {0x0000000008792b78} 'update' '()V' in 'com/yew/test/VolatileTest'
 #      [sp+0x40] (sp of caller)
 0x000000000f11ac40: mov   dword ptr [rsp+0ffffffffffffa000h],eax
 0x000000000f11ac47: push  rbp
 0x000000000f11ac48: sub   rsp,30h
 0x000000000f11ac4c: mov   r8,8792d70h    ;  {metadata(method data for {method} {0x0000000008792b78} 'update' '()V' in 'com/yew/test/VolatileTest')}
 0x000000000f11ac56: mov   edx,dword ptr [r8+0dch]
 0x000000000f11ac5d: add   edx,8h
 0x000000000f11ac60: mov   dword ptr [r8+0dch],edx
 0x000000000f11ac67: mov   r8,8792b70h    ;  {metadata({method} {0x0000000008792b78} 'update' '()V' in 'com/yew/test/VolatileTest')}
 0x000000000f11ac71: and   edx,0h
 0x000000000f11ac74: cmp   edx,0h
 0x000000000f11ac77: je   0f11ad68h     ;*iconst_1
                        ; - com.yew.test.VolatileTest::update@0 (line 17)
 0x000000000f11ac7d: mov   r8,0d7b08a30h   ;  {oop(a 'java/lang/Class' = 'com/yew/test/VolatileTest')}
 0x000000000f11ac87: mov   edx,1h
 0x000000000f11ac8c: mov   byte ptr [r8+68h],dl
volatile修飾
 0x000000000f11ac90: lock add dword ptr [rsp],0h ;*putstatic flag
                        ; - com.yew.test.VolatileTest::update@1 (line 17)
無Volatile修飾
 0x000000000f113707: mov byte ptr [r8+68h],1h ;*putstatic flag
                        ; - com.yew.test.VolatileTest::update@1 (line 17)
通過比較可知:改變共享變量flag的值為true,該變量由Volatile修飾,進行匯編打印時,會有l(wèi)ock前綴修飾,根據(jù)IA-32架構(gòu)軟件開發(fā)者手冊可知,lock前綴指令在多核CPU處理器下會引發(fā)兩件事情:
【1】將當前處理器緩存行的數(shù)據(jù)立即寫回系統(tǒng)內(nèi)存
【2】wirte操作會使其他處理器中緩存該內(nèi)存地址的數(shù)據(jù)無效
LOCK#聲言期間,處理器獨占任何共享內(nèi)存。IA-32處理器和Intel 64處理器使用MESI(修改、獨占、共享、無效)控制協(xié)議去維護內(nèi)部緩存和其他處理器緩存的一致性。通過嗅探技術(shù)保證處理器內(nèi)部緩存、系統(tǒng)緩存和其他處理器緩存的數(shù)據(jù)再總線上保持一致。當其他處理器打算回寫內(nèi)存地址,該地址是共享內(nèi)存區(qū)域,那么嗅探的處理器會將它的緩存行設置為無效,下次訪問相同內(nèi)存時,強制執(zhí)行緩存行填充。
0x000000000f11ac95: nop
 0x000000000f11ac98: jmp   0f11add4h     ;  {no_reloc}
 0x000000000f11ac9d: add   byte ptr [rax],al
 0x000000000f11ac9f: add   byte ptr [rax],al
 0x000000000f11aca1: add   byte ptr [rsi+0fh],ah
 0x000000000f11aca4: Fatal error: Disassembling failed with error code: 15Decoding compiled method 0x000000000f11ef50:
Code:
Argument 0 is unknown.RIP: 0xf11f080 Code size: 0x00000058
[Entry Point]
[Verified Entry Point]
[Constants]
 # {method} {0x0000000008792b78} 'update' '()V' in 'com/yew/test/VolatileTest'
 #      [sp+0x20] (sp of caller)
 0x000000000f11f080: mov   dword ptr [rsp+0ffffffffffffa000h],eax
 0x000000000f11f087: push  rbp
 0x000000000f11f088: sub   rsp,10h
 0x000000000f11f08c: mov   r10,0d7b08a30h  ;  {oop(a 'java/lang/Class' = 'com/yew/test/VolatileTest')}
 0x000000000f11f096: mov   byte ptr [r10+68h],1h
 0x000000000f11f09b: lock add dword ptr [rsp],0h ;*putstatic flag
                        ; - com.yew.test.VolatileTest::update@1 (line 17)
 0x000000000f11f0a0: mov   edx,1ch
 0x000000000f11f0a5: nop
 0x000000000f11f0a7: call  0f0557a0h     ; OopMap{off=44}
                        ;*getstatic out
                        ; - com.yew.test.VolatileTest::update@4 (line 18)
                        ;  {runtime_call}
 0x000000000f11f0ac: int3           ;*getstatic out
                        ; - com.yew.test.VolatileTest::update@4 (line 18)
 0x000000000f11f0ad: hlt
 0x000000000f11f0ae: hlt
 0x000000000f11f0af: hlt
 0x000000000f11f0b0: hlt
 0x000000000f11f0b1: hlt
 0x000000000f11f0b2: hlt
 0x000000000f11f0b3: hlt
 0x000000000f11f0b4: hlt
 0x000000000f11f0b5: hlt
 0x000000000f11f0b6: hlt
 0x000000000f11f0b7: hlt
 0x000000000f11f0b8: hlt
 0x000000000f11f0b9: hlt
 0x000000000f11f0ba: hlt
 0x000000000f11f0bb: hlt
 0x000000000f11f0bc: hlt
 0x000000000f11f0bd: hlt
 0x000000000f11f0be: hlt
 0x000000000f11f0bf: hlt
[Exception Handler]
[Stub Code]
 0x000000000f11f0c0: jmp   0f0883a0h     ;  {no_reloc}
[Deopt Handler Code]
 0x000000000f11f0c5: call  0f11f0cah
 0x000000000f11f0ca: sub   qword ptr [rsp],5h
 0x000000000f11f0cf: jmp   0f057600h     ;  {runtime_call}
 0x000000000f11f0d4: hlt
 0x000000000f11f0d5: hlt
 0x000000000f11f0d6: hlt
 0x000000000f11f0d7: hlt
true

4.volatile的使用優(yōu)化

java并發(fā)大師Doug Li在jdk7并發(fā)包中新增了一個隊列集合LinkeTransferQueue,它在使用Volatile關(guān)鍵字修飾變量時,采用追加字節(jié)的方式將變量填充到64字節(jié)

volatile修飾變量在進行修改時,會進行LOCK前置指令加鎖,鎖住緩存行的數(shù)據(jù)獨占

適用于:緩存行字節(jié)為64字節(jié) 處理器如 I7 酷睿 Pentium M等

不適用:非64字節(jié)寬的緩存行 P6系列或者奔騰 共享變量不會被頻繁的寫

5.并發(fā)編程的三大特性:可見性、原子性、有序性

volatile可以保證可見性、有序性,但是不保證原子性。

6.volatile關(guān)鍵字的語義分析

(1)保證可見性,volatile修飾的共享變量被修改時,其他處理器能立刻嗅探到共享變量值的改變

(2)保證有序性:根據(jù)happens-before原則可知,當變量使用volatile修飾時,程序代碼前后的位置不能發(fā)生指令重排和提取。

(3)volatile底層采用匯編的lock前綴指令鎖定共享變量內(nèi)存地址的緩存行,從而控制并發(fā)的安全性(輕量級synchronized)

7.volatile使用場景以及和synchronized的區(qū)別

使用場景:1.標志狀態(tài) 2.DCL--雙重檢測鎖(單例模式) 3.保證可見性、順序性

區(qū)別:

1.使用上:volatile修飾變量 synchronized修飾方法或者代碼塊

2.原子性的保證 volatile不保證原子性 synchronized可以保證原子性

3.可見性保證機制不同 volatile通過匯編的lock前綴指令 synchronized使用Monitor屬性(Moniterentet 入口 Moniterexit--出口(包含異常))

4.有序性保證的鎖的粒度 volatile粒度小,synchronized粒度大

5.其他 volatile不會引起線程阻塞 synchronized會引起線程的阻塞

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 全面解析Java8觀察者模式

    全面解析Java8觀察者模式

    這篇文章主要為大家全面解析Java8觀察者模式,通過在 Java8 環(huán)境下實現(xiàn)觀察者模式的實例,進一步介紹了什么是觀察者模式、專業(yè)化及其命名規(guī)則,感興趣的小伙伴們可以參考一下
    2016-02-02
  • 聊一聊帶智能提示的spring-boot-starter

    聊一聊帶智能提示的spring-boot-starter

    這篇文章主要介紹了帶智能提示的spring-boot-starter的相關(guān)知識,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2020-11-11
  • Java中過濾器、監(jiān)聽器和攔截器的區(qū)別詳解

    Java中過濾器、監(jiān)聽器和攔截器的區(qū)別詳解

    這篇文章主要介紹了Java中過濾器、監(jiān)聽器和攔截器的區(qū)別詳解,有些朋友可能不了解過濾器、監(jiān)聽器和攔截器的區(qū)別,本文就來詳細講一下,相信看完你會有所收獲,需要的朋友可以參考下
    2024-01-01
  • Java實現(xiàn)對一行英文進行單詞提取功能示例

    Java實現(xiàn)對一行英文進行單詞提取功能示例

    這篇文章主要介紹了Java實現(xiàn)對一行英文進行單詞提取功能,結(jié)合實例形式分析了java基于StringTokenizer類進行字符串分割的相關(guān)操作技巧,需要的朋友可以參考下
    2017-10-10
  • Mybatis如何解決sql中l(wèi)ike通配符模糊匹配問題

    Mybatis如何解決sql中l(wèi)ike通配符模糊匹配問題

    這篇文章主要介紹了Mybatis如何解決sql中l(wèi)ike通配符模糊匹配問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Java之JSF框架案例詳解

    Java之JSF框架案例詳解

    這篇文章主要介紹了Java之JSF框架案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • Java實現(xiàn)基于JDBC操作mysql數(shù)據(jù)庫的方法

    Java實現(xiàn)基于JDBC操作mysql數(shù)據(jù)庫的方法

    這篇文章主要介紹了Java實現(xiàn)基于JDBC操作mysql數(shù)據(jù)庫的方法,結(jié)合實例形式分析了java使用JDBC實現(xiàn)針對mysql數(shù)據(jù)庫的連接、查詢、輸出等相關(guān)操作技巧,需要的朋友可以參考下
    2017-12-12
  • spring的TransactionalEventListener事務感知源碼解析

    spring的TransactionalEventListener事務感知源碼解析

    這篇文章主要為大家介紹了spring的TransactionalEventListener事務感知源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • java設計模式--建造者模式詳解

    java設計模式--建造者模式詳解

    這篇文章主要介紹了Java設計模式之建造者模式,結(jié)合具體實例形式分析了建造者模式的概念、原理、實現(xiàn)方法與相關(guān)使用注意事項,需要的朋友可以參考下
    2021-07-07
  • java字符流緩沖區(qū)詳解

    java字符流緩沖區(qū)詳解

    這篇文章主要為大家詳細介紹了java字符流緩沖區(qū)的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08

最新評論