Volatile原子性一致性JVM指令重排

概念

  • Volatile概念:Volatile關鍵字的主要作用是使變量在多個線程間可見
  • 作用: 在多線程間可以進行變量的變更,使得線程間進行數據的共享可見 阻止指令重排序,happens-before
package com.example.core.cas;import com.example.core.safely.UseThreadLocal;public class UseVolatile extends Thread{private volatile boolean isRunning = true;private void setRunning(boolean isRunning){this.isRunning = isRunning;}public void run(){System.out.println("進入Run方法");while(isRunning == true){//...}System.err.println("線程停止");}public static void main(String[] args) throws InterruptedException{UseVolatile uv = new UseVolatile();uv.start();Thread.sleep(2000);uv.setRunning(false);System.out.println("isRunning的值已經被設置為false");}
}
  • ?一個線程可以執行的操作有使用(use)、賦值(assign)、裝載(load)、存儲(store)、鎖定(lock)、解鎖(unlock)。
  • 而主內存可以執行的操作有讀(read)、寫(write)、鎖定(lock)、解鎖(unlock),每個操作都是原子的。
  • volatile的作用就是強制線程到主內存(共享內存)里去讀取變量,而不去線程工作內存區里去讀取,從而實現了多個線程間的變量可見。也就是滿足線程安全的可見性

JVM

  • Java Memory Model(Java 內存模型),簡稱JMM,并發編程這塊,解決一個線程對共享變量的寫入何時對另一個線程可見!
  • 比如一個線程給變量 a 賦值 int a = 3; // 向變量 a 寫值 我要解決的問題就是:"在什么條件下,讀取變量a的線程將看到這個值3",如果缺少同步,那會有很多因素使得讀取變量a的線程不能立即看到或者永遠看不到這個值3
  • 所有的變量都存儲在主內存中, 每一個線程都有一個私有的本地內存,本地內存中存儲了該線程使用到的變量在主內存中拷貝! 線程對變量的所有操作(讀取、賦值等)都必須在工作內存中進行,而不能直接讀寫主內存中的變量(volatile變量也不例外
  • 如果一個操作執行的結果需要對另一個操作可見,那么這兩個操作之間必須要存在happens-before關系,A=1;B=A;就是A操作的結果要對B操作可見,那么必然存在A happens-before B 簡而言之:使用happens-before的概念來闡述操作之間的內存可見性
  • 例如:對一個鎖的解鎖,happens-before 于隨后對這個鎖的加鎖,先后順序很關鍵

指令重排

  • JAVA語言為了維持順序內部的順序化語義,也就是為了保證程序的最終運行結果需要和在單線程嚴格意義的順序化環境下執行的結果一致,程序指令的執行順序有可能和代碼的順序不一致,這個過程就稱之為指令的重排序
  • 指令重排序的意義在于:JVM能根據處理器的特性,充分利用多級緩存,多核等進行適當的指令重排序,使程序在保證業務運行的同時,充分利用CPU的執行特點,最大的發揮機器的性能
  • volatile可以阻止指令的重排序
  • 涉及到cpu底層的硬件對于語言的編寫

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/447308.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/447308.shtml
英文地址,請注明出處:http://en.pswp.cn/news/447308.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python修改文件內容,不需要read,write多個動作。

python 要修改文件內容,常用 是先read,后write , 再 rename,很不爽。 比如:需要 把 yuv_dir "../HD/" # "H:/HD_Master/1080i25/" 改為 yuv_dir "C:/HD/" # "H:…

Atomic系列類

Atomic系列類別 Atomic系列類封裝了一系列的基礎類型和對象操作,其主要目的就是為了實現原子性,主要核心類如下 AtomicIntegerAtomicLongAtomicBooleanAtomicIntegerArrayAtomicLongArrayAtomicReference 原子性的引用對象在對Atomic類操作的時候&…

python 系統學習筆記(十二)---os os.path os.walk

得到當前工作目錄,即當前 Python腳本工作的目錄路徑: os.getcwd() 返回指定目錄下的所有文件和目錄名:os.listdir()函數用來刪除一個文件:os.remove()刪除多個目錄:os.removedirs(r“c:\python”)檢驗給出的路徑是否是…

Java JUC工具類--CountDownLatch

CountDownLatch:用于監聽某些初始化操作,并且線程進行阻塞,等初始化執行完畢后,通知主線程繼續工作執行 package com.example.core.juc;import java.util.concurrent.CountDownLatch;public class UseCountDownLatch {public stat…

Java JUC工具類--CyclicBarrier

CyclicBarrier:柵欄的概念,多線程的進行阻塞,等待某一個臨界值條件滿足后,同時執行 類比:每個線程代表一個跑步運動員,當運動員都準備好后,才一起出發,只要有一個人沒有準備好&#…

人生感悟:人生像吃自助餐

問我怎樣管理欲望,過簡單生活?我的答案是:你要先學會品味人生,品味的同義詞,就叫做體悟內涵。 人為什么有這么多欲望?其實,我們每個人在一個社會,就像進入一個自助餐(buffet)店,食物非常的多…

Java JUC工具類--Future

Future模式,也是非常經典的設計模式,這種模式主要就利用空間換時間的概念,也就是說異步執行(需要開啟一個新的線程)在互聯網高并發的應用服務中,我們隨處可見這種理念和代碼,主要就是使用了這種…

職場與生活 八條原則 讓你不再浪費時間和提高效率

Heidi Roizen女士一度是硅谷人人爭相學習的典范。她曾創辦自己的公司并管理了14年之久。后來,她擔任蘋果公司主管開發者關系的高級副總裁。現在,她是DFJ Venture的一位風投家,她還在斯坦福主講一門名叫??“企業家精神??”的課程。她幾乎認…

Java JUC工具類--Exchanger

Exchanger Exchanger用于進行線程間的數據交換,它提供一個同步點,在這個同步點,兩個線程可以交換彼此的數據兩個線程通過exchange方法交換數據,如果一個線程先執行exchange方法,它會一直等待第二個線程也執行exchang…

爸爸的素質決定孩子飛多高,爸爸們請反復看!!!

好父親等于200個好老師,當爹的都好好看看,以后孩子不給力別怨別人! 孩子是父親的影子,希望每個閱讀完全文的父親,都能成為一個好父親。 NO.1爸爸是孩子最好的老師 爸爸的素質有多高,孩子就能飛多高 用理性的父愛幫…

Java JUC工具類--ForkJoin

ForkJoin Fork/Join框架是JAVA7提供的一個用于并行執行任務的框架,是一個把大任務分割成若干個小任務,最終匯總每個小任務結果后得到大任務結果的框架Fork/Join中兩個重要的類 ForkJoinTask:使用該框架,需要創建一個ForkJoin任務…

修復bug的12個關鍵步驟

要多少時間才能修復bug,事先是很難知道的,特別是如果你和這些代碼還素不相識的話,情況就更加撲朔迷離了。James Shore在《The Art of Agile 》一書中,明確指出要想修復問題得先知道問題的所在。而我們之所以無法準確估計時間是因為…

Java JUC工具類--Master-Worker

Master-Worker Master-Worker模式是常用的并行計算模式。它的核心思想是系統由兩類進程協作工作:Master進程和Worker進程Master負責接收和分配任務,Worker負責處理子任務當各個Worker子進程處理完成后,會將結果返回給Master,由Ma…

身體打來的電話,你一定要接!

心臟有問題時。左邊手臂會酸、麻、痛。肝臟有問題時。小腿晚上睡覺時容易抽筋。腎臟出現問題時。聲音就會出不來,就會沙啞。脾胃出現問題時。偏頭痛。附:五臟排毒最簡單有效的方法 一、心臟有問題時 1。呼吸會不順暢,胸口會悶也會刺痛&…

Java JUC工具類--Semaphore

Semaphore 在Semaphore信號量非常適合高并發訪問限制,新系統在上線之前,要對系統的訪問量進行評估,評估是經過以往的經驗、數據、歷年的訪問量,已經推廣力度進行一個合理的評估當然評估標準不能太大也不能太小,太大的…

python 基礎知識點整理 和具體應用

Python教程 Python是一種簡單易學,功能強大的編程語言。它包括了高效的高級數據結構和簡單而有效的方法,面向對象編程。Python優雅的語法,動態類型,以及它天然的解釋能力,使其成為理想的語言,腳本和應用程序…

Java 線程池相關問題

線程池的拒絕策略 AbortPolicy:直接拋出異常阻止系統正常工作。CallerRunsPolicy:只要線程池未關閉,該策略直接在調用者線程中,運行當前被丟棄的任務。DiscardOldestPolicy:丟棄最老的一個請求,嘗試再次提…

對編程人員我想說:多做 多實踐 多寫代碼

有很多人問我,怎樣提高自己的能力?有初學者,有水平達到一定程度的程序員。 我想說,不要過多的看代碼,看計算機理論,看別人寫的文章,代碼等,最重要的是自己理解了某個原理&#xff0c…

讀人是基礎,看人是關鍵,做人最重要

人生在世,讀人是基礎,看人是關鍵,做人最重要。 一、讀人——一個人就是一本書。讀人,比讀其他文字的書更難。在生活中,每個人都是書,每人又都是讀者。我們認認真真地讀,讀了大半輩子&#xff0c…