说说Java中原子性,可见性与指令重排序的理解
生活随笔
收集整理的這篇文章主要介紹了
说说Java中原子性,可见性与指令重排序的理解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
原子性:就是讀數據,處理數據,寫數據 這三個步驟不能被終止,或者打斷;就是不能被線程調度器中斷,切換線程。
這樣,才能保證,原子操作在線程切換,并行處理上保證數據地順序累加處理。
可見性:是Jvm較為突出的概念,其每一個線程有自己的工作內存空間,當某一個線程讀取了主內存的數據,那么會通知其他線程中自己的內存空間此數據被加屏障,不可讀;只能再次從主內存讀數據緩存到自己的內存空間。這個概念在Java volitile 關鍵字體現的,其他系統的這種線程交互機制也應該類似。
指令重排序:
處理器在核心計算區有算術計算芯,邏輯(與或邏輯)計算和位處理。比如:
if(i > 6) {a = b + c; }含有計算且被邏輯條件包含的代碼指令,一般在處理器上,先是在算術計算中心計算數據后放入高速緩存中;然后當邏輯條件成立后,才會寫回到內存中。原因就是cpu有不一樣的計算區,這也是提高CPU計算能力的方式。基于此原理,那么有了指令的重排序。對于并發系統,那么可能出現邏輯混亂現象,但是對于單線程,不存在這個問題。指令重排序是內核做的,所以jvm會和系統內核交互不讓其指令重排序。
對于多處理器的并發系統,那么即使遵循上面的三個原則,也是不是出現并發邏輯問題呢?
由于多個處理器,那么可以并發地讀主內存數據,然后處理寫回數據,這樣就會出現邏輯混亂問題。那么在多cpu系統,對于多線程處理同一個方法的任務的時候,調度器只允許一個cpu處理執行其中的一個線程。其他的線程都在等待區,等待前一個線程執行完,才會被調度,交給當前或者其他處理器處理。也就是保證了同一塊指令多線程處理的單CPU的順序執行。
總結
以上是生活随笔為你收集整理的说说Java中原子性,可见性与指令重排序的理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: wps自带的wps看图如何卸载?以win
- 下一篇: android view绘制过程