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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

因为我把JMM原理讲解了一遍,这给足了我涨薪的底气!

發布時間:2023/12/4 编程问答 59 豆豆
生活随笔 收集整理的這篇文章主要介紹了 因为我把JMM原理讲解了一遍,这给足了我涨薪的底气! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、什么是JMM?

JMM指的是Java內存模型,即 Java Memory Model

  • Java內存模型并不是一種實際存在的東西,而是一種人為形成的約定,是一種概念。

    關于JMM,我們需要了解一些相關的同步約定 :
  • 線程在解鎖前,必須將線程中的工作內存中存儲的值即時刷新到主內存中的共享變量!
  • 線程在加鎖前,必須讀取主存中的最新值到工作內存中!
  • 加鎖和解鎖是同一把鎖!
  • 線程中操作的數據要從主內存中讀取,并備份到線程自己的工作內存中,作為副本,主存并不會主動向線程更新數據。

    線程的八種內存交互操作:

    • lock(鎖定):作用于主內存的變量,把一個變量標識為線程獨占狀態
    • unlock(解鎖) :作用于主內存的變量,把一個處于鎖定狀態的共享變量釋放
    • read(讀取):作用于主內存的變量,把一個變量的值從主內存傳輸到線程的工作內存中
    • load(加載):作用于工作內存的變量,把通過read操作獲取的變量值放入工作內存中
    • use(使用):作用于工作內存的變量,把工作內存中的變量傳輸給執行引擎,每當虛擬機遇到需要使用到變量的值,就會使用到這個指令
    • assign(賦值):作用于工作內存的變量,把執行引擎傳輸過來的值放入工作內存
    • store(存儲):作用于主內存的變量,把一個從線程中的工作內存的變量值傳送到主內存中,以便后續的write操作
    • write(寫入):作用于主內存的變量,將store操作從工作內存獲取的變量值放入主內存中

    JMM對以上八種內存操作指令做出了如下約束:

      • read和load、user和assign、store和write、lock和unlock必須成對出現,不允許單獨操作其中一條指令
      • 不允許線程丟棄離它最近的assign操作,即工作內存中的變量值改變之后,必須告知主內存
      • 不允許一個線程將沒有assign過的數據從工作內存同步會主內存
      • 一個新的變量必須在主內存中產生,不允許工作內存私自初始化一個變量來作為共享變量,即實施use和 store操作之前 , 必須經過 load 和assign操作
      • 同一變量同一時間只允許一個線程對其進行lock操作;多次lock之后,必須執行相同次數的unlock對其解鎖
      • 如果對一個變量進行lock操作,會清空所有工作內存中此變量的值, 即每次獲得鎖的線程,加鎖前必須要重新讀取主內存中的變量值,才能提交給執行引擎進行use操作
      • 如果一個變量沒有被lock,就不能對其進行unlock操作,也不能對一個被其他線程鎖住的變量進行unlock
      • 對一個變量加鎖之前,必須把工作內存中的變量值同步回主內存

    存在問題:

    假設現在有一個main線程和一個普通線程,普通線程執行的操作是:當num為 0 時 ,一直循環下去;此時main線程給num賦值為 1 ,普通線程并不知道num已經被修改,程序就會一直執行,不會停止!

    public class VolatileDemo {private static int num = 0;public static void main(String[] args) {new Thread(()->{ // 線程1while (num == 0) {}}).start();try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}num = 1;System.out.println(num);} }

    解決方法 : volatile 關鍵字

    什么是volatile ?

    • volatile 是一種輕量級的同步機制,相對于synchronized來說

    • 保證可見性 => JMM 主內存中的共享變量修改之后,會通知所有線程備份到各自的工作內存中

    • 不保證原子性

    • 禁止指令重排

    最后,祝大家早日學有所成,拿到滿意offer

    總結

    以上是生活随笔為你收集整理的因为我把JMM原理讲解了一遍,这给足了我涨薪的底气!的全部內容,希望文章能夠幫你解決所遇到的問題。

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