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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

JAVA多线程(一)线程安全问题产生的原因

發布時間:2025/3/8 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JAVA多线程(一)线程安全问题产生的原因 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • JAVA線程內存與主存間映射示意圖

    • Java內存模型中規定了所有的變量都存儲在主內存中,每條線程還有自己的工作內存,線程的工作內存中保存了該線程使用的變量到主內存副本拷貝,線程對變量的所有操作(讀取、賦值)都必須在工作內存中進行,而不能直接讀寫主內存中的變量。不同線程之間無法直接訪問對方工作內存中的變量,線程間變量值的傳遞均需要在主內存來完成。

  • 工作內存與主內存間交互操作

  • Java內存模型只保證操作必須按順序執行,而沒有保證必須是連續執行。

  • 以下八種操作來完成

    • lock(鎖定):作用于主內存的變量,把一個變量標識為一條線程獨占狀態。

    • unlock(解鎖):作用于主內存變量,把一個處于鎖定狀態的變量釋放出來,釋放后的變量才可以被其他線程鎖定。

    • read(讀取):作用于主內存變量,把一個變量值從主內存傳輸到線程的工作內存中,以便隨后的load動作使用。

    • load(載入):作用于工作內存的變量,它把read操作從主內存中得到的變量值放入工作內存的變量副本中。

    • use(使用):作用于工作內存的變量,把工作內存中的一個變量值傳遞給執行引擎,每當虛擬機遇到一個需要使用變量的值的字節碼指令時將會執行這個操作。

    • assign(賦值):作用于工作內存的變量,它把一個從執行引擎接收到的值賦值給工作內存的變量,每當虛擬機遇到一個給變量賦值的字節碼指令時執行這個操作。

    • store(存儲):作用于工作內存的變量,把工作內存中的一個變量的值傳送到主內存中,以便隨后的write的操作。

    • write(寫入):作用于主內存的變量,它把store操作從工作內存中一個變量的值傳送到主內存的變量中。

  • 在執行上述八種基本操作時,必須滿足如下規則

    • 不允許read和load、store和write操作之一單獨出現。

    • 不允許一個線程丟棄它的最近assign的操作,即變量在工作內存中改變了之后必須同步到主內存中。

    • 不允許一個線程無原因地(沒有發生過任何assign操作)把數據從工作內存同步回主內存中。

    • 一個新的變量只能在主內存中誕生,不允許在工作內存中直接使用一個未被初始化(load或assign)的變量。即就是對一個變量實施use和store操作之前,必須先執行過了assign和load操作。

    • 一個變量在同一時刻只允許一條線程對其進行lock操作,lock和unlock必須成對出現。

    • 如果對一個變量執行lock操作,將會清空工作內存中此變量的值,在執行引擎使用這個變量前需要重新執行load或assign操作初始化變量的值。

    • 如果一個變量事先沒有被lock操作鎖定,則不允許對它執行unlock操作;也不允許去unlock一個被其他線程鎖定的變量。

    • 對一個變量執行unlock操作之前,必須先把此變量同步到主內存中(執行store和write操作)。

  • 重排序

  • 在執行程序時為了提高性能,編譯器和處理器經常會對指令進行重排序。

  • 長排序有以下幾種

    • 編譯器優化的重排序。編譯器在不改變單線程程序語義放入前提下,可以重新安排語句的執行順序。

    • 指令級并行的重排序。現代處理器采用了指令級并行技術來將多條指令重疊執行。如果不存在數據依賴性,處理器可以改變語句對應機器指令的執行順序。

    • 內存系統的重排序。由于處理器使用緩存和讀寫緩沖區,這使得加載和存儲操作看上去可能是在亂序執行。

    • 了保證內存的可見性,Java編譯器在生成指令序列的適當位置會插入內存屏障指令來禁止特定類型的處理器重排序。

  • 內存屏障

  • 內存屏障(Memory Barrier,或有時叫做內存柵欄,Memory Fence)是一種CPU指令,用于控制特定條件下的重排序和內存可見性問題。Java編譯器也會根據內存屏障的規則禁止重排序。

  • 內存屏障有以下幾種

    • LoadLoad屏障:對于這樣的語句Load1; LoadLoad; Load2,在Load2及后續讀取操作要讀取的數據被訪問前,保證Load1要讀取的數據被讀取完畢。

    • StoreStore屏障:對于這樣的語句Store1; StoreStore; Store2,在Store2及后續寫入操作執行前,保證Store1的寫入操作對其它處理器可見。

    • LoadStore屏障:對于這樣的語句Load1; LoadStore; Store2,在Store2及后續寫入操作被刷出前,保證Load1要讀取的數據被讀取完畢。

    • StoreLoad屏障:對于這樣的語句Store1; StoreLoad; Load2,在Load2及后續所有讀取操作執行前,保證Store1的寫入對所有處理器可見。它的開銷是四種屏障中最大的。在大多數處理器的實現中,這個屏障是個萬能屏障,兼具其它三種內存屏障的功能。

  • happens-before原則

  • Java內存模型下一些”天然的“happens-before關系,這些happens-before關系無須任何同步器協助就已經存在,可以在編碼中直接使用。如果兩個操作之間的關系不在此列,并且無法從下列規則推導出來的話,它們就沒有順序性保障,虛擬機可以對它們進行隨意地重排序。

  • 程序順序規則(Pragram Order Rule):在一個線程內,按照程序代碼順序,前面的操作先行發生于后面的操作。

  • 管程鎖定規則(Monitor Lock Rule):一個unlock操作先行發生于后面對同一個鎖的lock操作。

  • volatile變量規則(Volatile Variable Rule):對一個volatile變量的寫操作先行發生于后面對這個變量的讀取操作。

  • 線程啟動規則(Thread Start Rule):Thread對象的start()方法先行發生于此線程的每一個動作。

  • 線程終于規則(Thread Termination Rule):線程中的所有操作都先行發生于對此線程的終止檢測,我們可以通過Thread.join()方法結束,Thread.isAlive()的返回值等作段檢測到線程已經終止執行。

  • 線程中斷規則(Thread Interruption Rule):對線程interrupt()方法的調用先行發生于被中斷線程的代碼檢測到中斷事件的發生,可以通過Thread.interrupted()方法檢測是否有中斷發生。

  • 對象終結規則(Finalizer Rule):一個對象初始化完成(構造方法執行完成)先行發生于它的finalize()方法。

  • 傳遞性(Transitivity):如果操作A先行發生于操作B,操作B先行發生于操作C,那就可以得出操作A先行發生于操作C。

轉載于:https://blog.51cto.com/stroll/1852737

總結

以上是生活随笔為你收集整理的JAVA多线程(一)线程安全问题产生的原因的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 国产精品久久久久久久久久久久 | 天天干天天色天天射 | 在线免费观看国产视频 | 国产91色| 亚洲第一色图 | 久久久夜色精品 | 蜜臀99久久精品久久久久小说 | 日产久久视频 | 伊人影视久久 | 午夜三级在线 | jizz性欧美15| 成人性毛片 | 亚洲精品天堂网 | 天堂网2014av| 天天都色 | 国产日韩精品一区二区三区在线 | 牛牛视频在线观看 | 免费一级欧美 | 日本一区不卡视频 | 国产男女猛烈无遮挡a片漫画 | 久久av一区二区三区亚洲 | 第一福利丝瓜av导航 | 欧美日韩人妻精品一区在线 | 国产裸体视频网站 | 国产让女高潮的av毛片 | 成全世界免费高清观看 | 国产在线精品视频 | 日韩精品在线免费视频 | 国产精品福利视频 | 四季av在线一区二区三区 | 日本理论视频 | 日本大乳美女 | 欧美激情影音先锋 | 欧美日韩在线视频免费 | 婷婷精品视频 | 欧美爱爱小视频 | 日本一区二区三区视频在线观看 | 日本韩国中文字幕 | 国产视频一区二区三区四区五区 | 夜夜成人 | 久久久久久久久久久国产 | 中文字幕一区二区不卡 | 青青草国产成人av片免费 | 国产乱码77777777| 午夜免费观看视频 | 午夜天堂精品 | 99超碰在线观看 | 成人黄色小说视频 | 高清在线一区二区 | 天天色天天搞 | 麻豆视频黄色 | 亚洲福利影院 | 午夜网页 | 激情久久av | 熟妇高潮一区二区高潮 | 欧美不卡一二三 | 久久久久久久综合 | 欧美高清视频一区二区 | 三级黄网 | 一区二区三区国产 | 变态另类一区二区 | 91丨国产丨捆绑调教 | 精品人妻无码一区二区色欲产成人 | 国产伦精品一区二区三区千人斩 | 欧美精品黄色片 | 亚洲日本中文字幕 | 小妹色播 | 亚洲国产专区 | 国产极品美女在线 | 操色网 | 少妇捆绑紧缚av | 夜夜嗨老熟女av一区二区三区 | jiizzyou欧美2 | 中文字幕二 | 毛片毛片 | 日干夜操 | 国产精品免费视频一区二区 | 亚洲精品国偷拍自产在线观看蜜桃 | 日日夜夜操视频 | 亚洲女人天堂网 | xxxx18日本 | www色综合 | 黄色一级播放 | 精品国产一区二区三区久久久 | 日韩精品人妻一区 | 久久久99精品国产一区二区三区 | 97在线观看| 欧洲一区二区在线观看 | 精品国产无码一区二区三区 | 欧美色图一区二区 | 日韩精品欧美 | 免费一级欧美片在线播放 | 成人综合av | 天天干天天操天天摸 | 日韩欧美视频一区 | 女生毛片| 丁香婷婷亚洲 | 色在线免费 | 久热色|