日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java多线程编程笔记4:Java内存模型

發布時間:2023/12/31 java 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java多线程编程笔记4:Java内存模型 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Java內存模型

Java內存模型試圖屏蔽各種硬件和操作系統的內存訪問差異,以實現讓Java程序在各種平臺下都能達到一致的內存訪問效果。

處理器上的寄存器讀寫速度比內存快幾個數量級,為了解決這種速度矛盾,在它們之間加入了高速緩存。同時產生了緩存一致性問題,如果多個緩存共享同一塊主內存區域,多個緩存的數據可能不一致,需要協議來解決這個問題。

所有的變量存儲在主內存中,每個線程有自己的工作內存,工作內存存儲在高速緩存或寄存器中,保存了該線程使用的變量的主內存副本拷貝。線程只能直接操作工作內存中的變量,不同線程之間的變量值傳遞需要通過主內存來完成。

內存間交互

Java內存模型定義了8個操作來完成主內存和工作內存的交互操作。

  • read:把一個變量的值從主內存傳輸到工作內存中
  • load:在 read 之后執行,把 read 得到的值放入工作內存的變量副本中
  • use:把工作內存中一個變量的值傳遞給執行引擎
  • assign:把一個從執行引擎接收到的值賦給工作內存的變量
  • store:把工作內存的一個變量的值傳送到主內存中
  • write:在 store 之后執行,把 store 得到的值放入主內存的變量中
  • lock:作用于主內存的變量
  • unlock

內存模型的三大特性

1. 原子性

原子性就是指一個操作中要么全部執行成功,否則失敗。Java內存模型保證了上述的八個操作具有原子性。但是Java內存模型允許虛擬機將沒有被volatile修飾的64位數據(long,double)的讀寫操作劃分為兩次32位操作進行,因此load,store,read和write操作不具備原子性。但是JMM只保證了上述操作的原子性,像是i++這樣的操作,其實是分為獲取i,i自增以及賦值給i三步的,如果要實現這樣的原子操作就需要使用原子類實現,或者也可以使用它synchronized互斥鎖來保證操作的原子性。

2. 可見性

可見性指當一個線程修改了共享變量的值,其它線程能夠立即得知這個修改。Java內存模型是通過在變量修改后將新值同步回主內存,在變量讀取前從主內存刷新變量值來實現可見性的。

可見性的三種是實現方式:

  • volatile
  • synchronized,對一個變量執行unlock操作之前,必須把變量值同步回主內存。
  • final,被 final關鍵字修飾的字段在構造器中一旦初始化完成,并且沒有發生 this 逃逸(其它線程通過 this 引用訪問到初始化了一半的對象),那么其它線程就能看見 final 字段的值。

使用 volatile 關鍵詞修飾的變量每次讀取都會得到最新的數據,不管哪個線程對這個變量的修改都會立即刷新到主內存。但是 volatile 關鍵字不能保證操作的原子性。

synchronized和加鎖也能能保證可見性,實現原理就是在釋放鎖之前其余線程是訪問不到這個共享變量的。但是和 volatile 相比開銷較大。

3. 順序性

假設有三個語句a,b,c。在同一個線程內,操作是有序的,以a->b->c的順序執行。但是,JMM在保證最終結果和代碼順序執行結果一致的情況下,為了提高整體效率會進行指令重排。在單線程中重排不會問題,在多小縣城中,可能會有數據不一致的問題。

Java中可以使用volatile關鍵字來保證順序性,還可以用synchronized和lock來保證。

volatile 關鍵字通過添加內存屏障的方式來禁止指令重排,即重排序時不能把后面的指令放到內存屏障之前。

通過 synchronized 和 lock 來保證有序性,它保證每個時刻只有一個線程執行同步代碼,相當于是讓線程順序執行同步代碼。

JVM通過happen-before來保證順序性

除了使用volatile和synchronized保證順序性,JVM還規定了先行發生原則,讓一個操作無需控制就能先于另一個操作完成。

  • 單一線程原則:在一個線程內,程序前面的操作先于后面的操作。
  • 管程鎖定規則:一個unlock操作先于后面對同一個鎖的lock操作發生。
  • volatile變量規則:對一個 volatile 變量的寫操作先行發生于后面對這個變量的讀操作,也就是說讀取的值肯定是最新的。
  • 線程啟動規則:Thread對象的start()方法調用先行發生于此線程的每一個動作。
  • 線程加入規則:Thread 對象的結束先行發生于 join() 方法返回。
  • 線程中斷規則:對線程 interrupt() 方法的調用先行發生于被中斷線程的代碼檢測到中斷事件的發生,可以通過 interrupted() 方法檢測到是否有中斷發生。
  • 對象終結規則:一個對象的初始化完成(構造函數執行結束)先行發生于它的 finalize() 方法的開始。
  • 傳遞性:如果操作 A 先行發生于操作 B,操作 B 先行發生于操作 C,那么操作 A 先行發生于操作 C。
  • 參考資料

    • github.com/CyC2018/CS-…
    • crossoverjie.top/JCSprout/#/…

    總結

    以上是生活随笔為你收集整理的Java多线程编程笔记4:Java内存模型的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 法国经典free性复古xxxx | 蘑菇福利视频一区播放 | 免费黄色小视频网站 | 国产精品久久久久精 | 69欧美视频 | 伊人加勒比 | 日本边添边摸边做边爱 | 办公室大战高跟丝袜秘书经理ol | 国产精品久久久久久一区二区 | 亚欧成人| 一级黄色录相 | 日本美女黄网站 | 日本黄色小片 | xxxx黄色| 亚洲乱码精品 | 调教驯服丰满美艳麻麻在线视频 | 国产九色91回来了 | 日韩精品一区二区亚洲av观看 | 99久久婷婷国产综合精品 | 日韩一区二区三区免费 | 伊人狼人久久 | 欧美性生交片4 | 一区二区三区免费在线视频 | 久久国产精品久久久 | 巨胸挤奶视频www网站 | 天堂а√在线中文在线鲁大师 | 五月开心激情 | 女人的天堂网 | 中国亚洲女人69内射少妇 | 欧美一二三四五区 | 国内精品视频在线观看 | av大全在线观看 | 中文字幕在线视频免费播放 | 国产成人专区 | 国产视频一区二区三区在线播放 | 风韵少妇性饥渴推油按摩视频 | 青青草原国产视频 | 一级视频免费观看 | 一区二区视频在线 | av一区不卡 | 国产精品午夜在线观看 | 日韩欧美亚洲综合 | 久久久久人妻一道无码AV | 欧美激情免费在线观看 | 超碰日日夜夜 | 神马久久精品 | 一区二区高清 | 邪恶久久 | 久久久久99精品 | 国产精品久久久久久亚洲色 | 国产精品极品白嫩在线 | 农村老妇性真猛 | 国产综合视频在线 | 亚洲成人高清在线观看 | 色吧综合 | 亚洲av成人精品一区二区三区 | 中文av资源 | 亚洲精品一区二区18漫画 | 丝袜国产在线 | 国产一区二区三区精品视频 | 国产操 | 裸体美女免费视频网站 | 医生强烈淫药h调教小说视频 | 欧美日本一道本 | 亚洲精品一区二区 | youjizz.com国产| 看免费的毛片 | avtt久久| 亚洲女人视频 | 嫩草视频在线免费观看 | 在线观看成人免费视频 | 日本久久高清视频 | 午夜三级网站 | 一区二区av电影 | 久久精品99北条麻妃 | 成人精品久久 | 国产麻豆xxxvideo实拍 | 国产一区二区视频在线 | 亚洲综合专区 | 久久久久久久久久一级 | 色婷婷a | 久久精品人妻一区二区 | 国产高清黄色 | 动漫大乳美女 | 人人射影院 | 久久人人干 | 日韩一区二区三区在线 | av片免费在线 | 亚洲国产精品久久AV | 蜜桃视频一区二区三区在线观看 | 中文字幕2018| 亚洲一区中文字幕永久在线 | 亚洲综合自拍 | 精品伦精品一区二区三区视频 | 午夜视频免费在线观看 | 天天天干干干 | 国产精品成人av久久 | 精品国产视频在线 | av天天在线 |